在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++程序的内存,确保程序的稳定性和性能。