在Linux上,C++程序的內存管理主要涉及以下幾個方面:
使用new
和delete
操作符:
int* ptr = new int; // 分配內存
*ptr = 42;
delete ptr; // 釋放內存
使用malloc
和free
函數(C風格):
int* ptr = (int*)malloc(sizeof(int)); // 分配內存
*ptr = 42;
free(ptr); // 釋放內存
void func() {
int localVar; // 棧內存
}
valgrind
來檢測內存泄漏:valgrind --leak-check=full ./your_program
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
:用于解決shared_ptr
的循環引用問題。std::weak_ptr<int> weakPtr = ptr1;
struct alignas(16) AlignedStruct {
char data[16];
};
mmap
系統調用將文件映射到內存中:int fd = open("file.txt", O_RDONLY);
struct stat sb;
fstat(fd, &sb);
void* addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
close(fd);
return 1;
}
// 使用映射的內存
munmap(addr, sb.st_size);
close(fd);
#include <vector>
class MemoryPool {
public:
void* allocate(size_t size) {
if (size > blockSize) {
throw std::bad_alloc();
}
if (freeList.empty()) {
expandPool();
}
void* ptr = freeList.back();
freeList.pop_back();
return ptr;
}
void deallocate(void* ptr) {
freeList.push_back(ptr);
}
private:
void expandPool() {
void* newBlock = malloc(blockSize * numBlocks);
for (size_t i = 0; i < numBlocks; ++i) {
void* ptr = static_cast<char*>(newBlock) + i * blockSize;
freeList.push_back(ptr);
}
blockSize *= 2;
numBlocks *= 2;
}
size_t blockSize = 4096;
size_t numBlocks = 10;
std::vector<void*> freeList;
};
std::atomic
和內存屏障來確保多線程環境下的內存可見性和順序性。#include <atomic>
std::atomic<int> counter(0);
void incrementCounter() {
counter.fetch_add(1, std::memory_order_relaxed);
}
通過以上方法,可以在Linux上有效地管理C++程序的內存,確保程序的穩定性和性能。