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

对malloc的调用与对free的调用不匹配。 似乎依赖于使用该应用程序的应用程序无法连续调用足够多的new程序,从而导致该应用程序泄漏大量内存。

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

我的问题是:

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

===============>>#1 票数:0

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

===============>>#2 票数:0 已采纳

缺少的“免费”意味着您无法将其嵌入到更大的应用程序中,无法启动,关闭它并最终回到开始的位置。 如果您控制整个应用程序,则很好,如果实际上必须嵌入此代码,则不好。 为了使这项工作有效,您将需要一些进入引导程序的入口点以免费方式进行。

从传统意义上讲,它永远不会泄漏,因为每个分配的块都由操作员删除存储在向量中以便重新使用,并且如果操作员删除看到向量中有太多项,则会进行抱怨。

  ask by Carl translate from so

未解决问题?本站智能推荐: