【发布时间】:2014-12-07 19:29:28
【问题描述】:
我让我的对象使用重载的 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 在container.container.什么时候使用?我试着看看Foo的new在调用时是否被触发
std::vector<Foo*> fooVector;
fooVector.reserve(10);
但什么也没发生。
我有几个问题:
我是否正确暗示在这种情况下分配器只为指针分配内存?
这是否意味着当容器保存对象而不是指针时分配器在 Foo 上调用“new”?
如果是,是否意味着如果我已经使用内存池在对象中分配内存(如 Foo 示例),我不需要使用内存池编写自定义分配器?
更新:
为了清楚起见,我考虑到只有使用内存池重载 new/delete 的对象与这个问题有关。我完全知道没有 new/deleted 重载的对象仍然使用默认堆作为动态内存分配的来源。
【问题讨论】:
-
不,您的代码仍在使用默认分配器
-
我知道我仍然使用默认分配器,但它会使用 Foo 的“新”来分配吗?
-
如果你从不告诉它使用
Foo,它就不会使用Foo。 -
Foo和Foo*是不同的东西。 -
@T.C.我毫不怀疑他们是 ;)
标签: c++ memory-management stl allocator