创建范围的自定义内存池/分配器?

时间:2010-09-08 18:32:09

标签: c++ memory-management

在C ++中是否可以创建一个像这样工作的自定义分配器:

{
    // Limit memory to 1024 KB
    ScopedMemoryPool memoryPool(1024 * 1024); 

    // From here on all heap allocations ('new', 'malloc', ...) take memory from the pool.
    // If the pool is depleted these calls result in an exception being thrown.

    // Examples:
    std::vector<int> integers(10);
    int a * = new int [10];
}

我在boost库或其他地方找不到这样的东西。

是否存在使这不可能的根本问题?

5 个答案:

答案 0 :(得分:3)

您需要创建一个自定义分配器,并将其作为模板参数传递给vector。这个自定义分配器实际上会包含对池的访问权限并执行它想要的任何大小验证。

答案 1 :(得分:2)

是的,你可以制作这样的结构,它在许多游戏中使用,但你基本上需要实现自己的容器并调用你创建的那个池的内存分配方法。

您也可以尝试为STL容器编写自定义分配器,尽管通常建议不要使用这种工作。 (我以前做过,而且很乏味,但我不记得任何具体的问题。)

介意 - 编写自己的内存分配器并不适合胆小的人。你可以看看Doug Lea's malloc,它提供了“内存空间”,你可以在你的范围构造中以某种方式使用它。

答案 2 :(得分:1)

我会回答另一个问题。看看'高效的c ++'一书。他们讨论的一件事就是实现这种事情。这是一个Web服务器

对于这个特殊的事情,你可以通过覆盖new并向STL提供自定义分配器来弄乱c ++层。

或者你可以搞乱malloc级别,从自定义malloc开始并从那里开始工作(如dmalloc)

答案 3 :(得分:0)

  

是否存在使这不可能的根本问题?

争论程序行为从根本上说是不可能的。会出现各种各样奇怪的问题。代码的某些部分可能会执行也可能不会执行,但这对于可能无阻碍地工作的下一部分几乎没有影响。某些部分可能总是失败。处理标准库或任何其他第三方库将变得非常困难。运行时有时可能会出现碎片,有时也可能出现碎片。

答案 4 :(得分:0)

如果意图是该范围内的所有分配都与该分配器对象一起发生,那么它本质上是一个线程局部变量。

因此,如果使用static或全局变量来实现它,将会出现多线程问题。否则,对于分配器的无状态而言,这不是一个糟糕的解决方法。

(当然,你需要传递第二个模板参数,例如vector< int, UseScopedPool >。)

相关问题