写一个c++版本的内存池
时间: 2024-04-07 19:33:17 浏览: 57
当然,我可以帮你写一个简单的 C++ 版本的内存池。下面是一个示例代码:
```cpp
#include <iostream>
#include <vector>
class MemoryPool {
public:
// 构造函数,初始化内存池
MemoryPool(size_t blockSize, size_t numBlocks) : blockSize(blockSize), numBlocks(numBlocks) {
memory.resize(blockSize * numBlocks);
// 将所有块连接起来,构建一个空闲链表
for (size_t i = 0; i < numBlocks - 1; ++i) {
*reinterpret_cast<size_t*>(&memory[i * blockSize]) = (i + 1) * blockSize;
}
*reinterpret_cast<size_t*>(&memory[(numBlocks - 1) * blockSize]) = 0;
freeList = reinterpret_cast<size_t*>(&memory[0]);
}
// 从内存池中分配一块内存
void* allocate() {
if (freeList) {
void* block = freeList;
freeList = reinterpret_cast<size_t*>(*freeList);
return block;
}
else {
throw std::bad_alloc();
}
}
// 释放已分配的内存块
void deallocate(void* block) {
*reinterpret_cast<size_t*>(block) = reinterpret_cast<size_t>(freeList);
freeList = reinterpret_cast<size_t*>(block);
}
private:
std::vector<char> memory; // 内存池存储空间
size_t blockSize; // 每块内存的大小
size_t numBlocks; // 内存块的数量
size_t* freeList; // 空闲链表的头指针
};
int main() {
// 创建一个内存池,每个内存块大小为 sizeof(int),共有 10 个内存块
MemoryPool memoryPool(sizeof(int), 10);
// 从内存池中分配一块内存
int* p1 = static_cast<int*>(memoryPool.allocate());
*p1 = 42;
std::cout << *p1 << std::endl;
// 释放已分配的内存块
memoryPool.deallocate(p1);
return 0;
}
```
这段代码实现了一个简单的内存池,使用一个连续的内存空间来管理分配和释放的内存块。每个内存块的大小由 `blockSize` 参数指定,共有 `numBlocks` 个内存块。你可以根据自己的需求进行修改和扩展。注意,这只是一个简单的示例,实际应用中可能需要考虑更多的复杂情况和线程安全性等问题。
阅读全文