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

Mic*_* IV 1 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);
    }

};
Run Code Online (Sandbox Code Playgroud)

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

std::vector<Foo*> fooVector;
fooVector.reserve(10);
Run Code Online (Sandbox Code Playgroud)

但没有任何反应.

我有几个问题:

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

是否意味着当容器包含对象而不是指针时,分配器在Foo上调用"new"?

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

更新:

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

Jam*_*nze 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,而是包含a的一些更复杂的类型Foo.

  • @MichaelIV:是的,除了你正在构建一个指针容器之外,所以分配器根本不用于分配`Foo`对象,这一点没有实际意义! (3认同)