0

我这里有一些实现动态内存池的代码。池从大小 0 开始,并随着每次连续分配而增长。它用于尝试最小化大量分配和取消分配的开销。

对 malloc 的调用与对 free 的调用不匹配。它似乎依赖于使用它的应用程序没有连续调用足够的新的应用程序来泄漏大量内存。

我没有写它,所以这是我最好的猜测。

我的问题是:

  1. 是没有调用释放错误还是我错过了与重载删除运算符有关的内容?
  2. 这个实现是否依赖操作系统来清理退出时泄漏的少量内存?

谢谢。

//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_;
}
4

2 回答 2

0

缺少的“免费”意味着您无法将其嵌入到某个更大的应用程序中,无法启动、关闭并最终回到您开始的位置。如果您控制整个应用程序,这很好,但如果此代码实际上必须是可嵌入的,那​​就不好了。要完成这项工作,您需要一些入口点来自由地遍历向量调用。

在传统意义上它从不泄漏,因为每个 malloc 的块都由 operator delete 存储在 vector 中以供重用,并且 operator delete 如果在 vector 中看到太多项目,则会抱怨。

于 2013-04-16T03:55:00.483 回答
0

您正在创建一个内存池。此池实现将根据需要增长,但永远不会将内存返回给操作系统。这通常是一个错误,但在创建您自己的分配内存的方法时不是 - 只要这个池在您的程序的生命周期中存在。当程序退出时你会泄漏,但你可能会忍受。基本上,您将覆盖 new/malloc 通常的工作方式并完全自行处理内存。

于 2013-04-16T03:49:33.367 回答