默认的stl分配器如何分配?

时间:2014-10-13 09:15:04

标签: c++ memory-management stl allocator

我让我的对象使用重载的new / delete操作符,因为我使用内存池来分配内存。 他们看起来像这样:

class Foo{

 public:  
    void* operator new(size_t nbytes){

        return MemoryManager::GetInstance().AllocFooTypeMemory();

    }
    void operator delete(void* p)
    {
        MemoryManager::GetInstance().FreeFooTypeMemory(p);
    }

};

现在,我的问题是当我创建一个Foo指针的STL容器时它是如何工作的?Here写入默认STL分配器使用 :: operator new 来分配内存在容器中。什么时候使用它?我试着看看在调用

时是否触发了Foo的新功能
std::vector<Foo*> fooVector;
fooVector.reserve(10);

但没有任何反应。

我有几个问题:

我是否正确地暗示在这种情况下,分配器仅为指针分配内存?

当容器保存对象而不是指针时,是否意味着分配器在Foo上调用“new”?

如果是,那么这是否意味着如果我已经使用池在对象中分配内存(如在Foo示例中),我不需要使用mem pool编写自定义分配器?

更新:

为了说清楚,我考虑到只有内存池重载new / delete的对象与这个问题有关。我完全清楚没有new / deleted重载的对象仍然使用默认堆动态内存分配的来源。

2 个答案:

答案 0 :(得分:7)

默认分配器不能使用特定于类的operator new, 因为它不包含new表达式;它称之为 ::operator new直接起作用,分离和分配 初始化。

在您的情况下,当然,您没有Foo的容器, 但在Foo*中,您在Foo中定义的任何内容都无关紧要 (并且您无法为指针定义operator new)。

关于您的具体问题:

  • std::vector<Foo*>中,向量只会分配 指针。它怎么可能做其他事情?

  • 如果容器包含Foo而不是Foo*,则问题 更复杂;默认分配器将使用::operator new 分配内存,::new (size_t, void*)... 构建对象。

  • 您不希望在内存池中使用内存池 一个容器。如果容器是std::vector,则为对象 将在连续的记忆中,通常不应该采取 从池中,到其他类型的容器,是什么 分配通常不是Foo,而是更复杂 包含Foo

  • 的类型

答案 1 :(得分:0)

在您的情况下,Overaloading new和delete运算符仅适用于Foo类。这意味着,以下调用使用您的自定义new和deleteL:

Foo * p - new Foo();
delete p;

使用new和delete的其余动态内存分配使用默认值,而不是你的。 相反,您可以尝试使用overalod global new和delete运算符,而不是Foo特定的。

相关问题