我让我的对象使用重载的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重载的对象仍然使用默认堆动态内存分配的来源。
答案 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特定的。