我这里有一些实现动态内存池的代码。池从大小 0 开始,并随着每次连续分配而增长。它用于尝试最小化大量分配和取消分配的开销。
对 malloc 的调用与对 free 的调用不匹配。它似乎依赖于使用它的应用程序没有连续调用足够的新的应用程序来泄漏大量内存。
我没有写它,所以这是我最好的猜测。
我的问题是:
- 是没有调用释放错误还是我错过了与重载删除运算符有关的内容?
- 这个实现是否依赖操作系统来清理退出时泄漏的少量内存?
谢谢。
//Obj.h
class Obj
{
public:
Obj(){};
void* operator new(std::size_t size);
void operator delete(void* p);
private:
static std::vector<void*> pool_;
static std::size_t checked_in_;
static std::size_t checked_out_;
};
//Obj.cpp
std::vector<void*> Obj::pool_;
std::size_t Obj::checked_out_ = 0;
std::size_t Obj::checked_in_ = 0;
void* Obj::operator new(std::size_t size)
{
if (pool_.empty())
{
++checked_out_;
return malloc(size);
}
else
{
--checked_in_;
++checked_out_;
void* p = pool_.back();
pool_.pop_back();
return p;
}
}
void Obj::operator delete(void* p)
{
pool_.push_back(p);
if (pool_.size() % 10000 == 0)
{
std::cout<<"mem leak\n";
}
--checked_out_;
++checked_in_;
}