在Linux下使用C++进行内存管理,主要涉及以下几个方面:
栈内存管理:
堆内存管理:
new和delete(或malloc和free)来管理。new分配的内存需要使用delete来释放;使用malloc分配的内存需要使用free来释放。智能指针:
std::unique_ptr、std::shared_ptr和std::weak_ptr),它们可以自动管理内存,避免内存泄漏。std::unique_ptr独占资源所有权,当unique_ptr被销毁时,它所管理的资源也会被自动释放。std::shared_ptr允许多个指针共享同一个资源,通过引用计数来管理资源的生命周期。std::weak_ptr用于解决shared_ptr的循环引用问题。内存池:
自定义内存分配器:
以下是一些示例代码,展示了如何在Linux下使用C++进行内存管理:
void exampleFunction() {
int localVar = 10; // 栈内存
// localVar 在函数返回时自动释放
}
#include <iostream>
int main() {
int* ptr = new int(10); // 动态分配内存
std::cout << *ptr << std::endl;
delete ptr; // 释放内存
return 0;
}
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> uniquePtr(new int(10));
std::cout << *uniquePtr << std::endl;
// uniquePtr 在离开作用域时自动释放内存
std::shared_ptr<int> sharedPtr = std::make_shared<int>(20);
std::cout << *sharedPtr << std::endl;
// sharedPtr 在最后一个引用被销毁时自动释放内存
std::weak_ptr<int> weakPtr = sharedPtr;
if (auto lockedPtr = weakPtr.lock()) {
std::cout << *lockedPtr << std::endl;
}
return 0;
}
#include <iostream>
#include <vector>
class MemoryPool {
public:
MemoryPool(size_t blockSize, size_t numBlocks) : blockSize(blockSize), numBlocks(numBlocks) {
pool = malloc(blockSize * numBlocks);
for (size_t i = 0; i < numBlocks; ++i) {
freeList.push_back(static_cast<char*>(pool) + i * blockSize);
}
}
~MemoryPool() {
free(pool);
}
void* allocate() {
if (freeList.empty()) {
throw std::bad_alloc();
}
void* ptr = freeList.back();
freeList.pop_back();
return ptr;
}
void deallocate(void* ptr) {
freeList.push_back(static_cast<char*>(ptr));
}
private:
size_t blockSize;
size_t numBlocks;
void* pool;
std::vector<char*> freeList;
};
int main() {
MemoryPool pool(64, 10);
void* ptr = pool.allocate();
// 使用 ptr
pool.deallocate(ptr);
return 0;
}
通过合理使用这些内存管理技术,可以有效地管理内存,避免内存泄漏和其他内存相关问题。