在Linux下,C++程序的内存管理主要涉及到堆和栈的使用。以下是一些关键点:
new和delete(或malloc和free)进行分配和释放。new 和 delete:int* ptr = new int; // 分配一个int大小的内存
delete ptr; // 释放内存
malloc 和 free:int* ptr = (int*)malloc(sizeof(int)); // 分配一个int大小的内存
free(ptr); // 释放内存
为了减少内存泄漏的风险,C++11引入了智能指针,如std::unique_ptr、std::shared_ptr和std::weak_ptr。
std::unique_ptr:独占所有权,不能被复制,只能移动。std::unique_ptr<int> ptr(new int(42));
std::shared_ptr:共享所有权,可以被多个指针共享,引用计数管理内存。std::shared_ptr<int> ptr1 = std::make_shared<int>(42);
std::shared_ptr<int> ptr2 = ptr1; // 共享所有权
std::weak_ptr:配合std::shared_ptr使用,避免循环引用。std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
std::weak_ptr<int> weakPtr = sharedPtr;
valgrind --leak-check=full ./your_program
g++ -fsanitize=address -o your_program your_program.cpp
./your_program
posix_memalign或C++17的std::aligned_alloc进行对齐分配。void* ptr;
posix_memalign(&ptr, 32, 1024); // 分配1024字节,对齐到32字节边界
free(ptr);
int fd = open("file.txt", O_RDONLY);
void* addr = mmap(NULL, sizeof(file_contents), PROT_READ, MAP_PRIVATE, fd, 0);
// 使用addr进行读写操作
munmap(addr, sizeof(file_contents));
close(fd);
通过合理使用这些内存管理方法,可以有效地提高C++程序在Linux下的性能和稳定性。