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重载的对象仍然使用默认堆作为源动态内存分配.
默认分配器不能使用特定的类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
.