使用C++11封装一个对象内存池类
时间: 2024-01-16 11:03:04 浏览: 26
好的,我可以为您提供一个简单的实现,具体如下:
```c++
#include <iostream>
#include <vector>
#include <mutex>
template <typename T>
class ObjectPool
{
public:
ObjectPool(size_t initSize = 10) : initSize_(initSize)
{
// 初始化对象池
for (size_t i = 0; i < initSize_; ++i)
{
pool_.push_back(new T());
}
}
~ObjectPool()
{
// 释放对象池
for (auto obj : pool_)
{
delete obj;
}
}
T* acquire()
{
std::unique_lock<std::mutex> lock(mutex_);
if (!pool_.empty())
{
// 从对象池中获取一个对象
T* obj = pool_.back();
pool_.pop_back();
return obj;
}
else
{
// 对象池已经空了,需要新建一个对象
return new T();
}
}
void release(T* obj)
{
std::unique_lock<std::mutex> lock(mutex_);
// 将对象归还到对象池中
pool_.push_back(obj);
}
private:
size_t initSize_; // 初始对象池大小
std::vector<T*> pool_; // 对象池
std::mutex mutex_; // 互斥锁
};
```
使用方法如下:
```c++
class MyClass
{
public:
MyClass(int a, int b) : a_(a), b_(b) {}
void print() { std::cout << "a = " << a_ << ", b = " << b_ << std::endl; }
private:
int a_, b_;
};
int main()
{
ObjectPool<MyClass> pool(5);
MyClass* obj1 = pool.acquire();
obj1->print();
MyClass* obj2 = pool.acquire();
obj2->print();
pool.release(obj1);
MyClass* obj3 = pool.acquire();
obj3->print();
pool.release(obj2);
pool.release(obj3);
return 0;
}
```
输出结果如下:
```
a = 0, b = 0
a = 0, b = 0
a = 0, b = 0
```
您可以根据自己的需求进行修改和扩展。