(例如,在使用线程构建模块的内存池)如果容器和分配器都是同一个内存池的一部分,我还需要调用std :: container的析构函数吗?
可以说我有以下设置:
using MemoryPool = tbb::memory_pool<std::allocator<char>>;
using CustomAllocator = tbb::memory_pool_allocator<Result*>;
using CustomVector = std::vector<Result*, CustomAllocator>;
MemoryPool shortTermPool;
void* allocatedMemory = shortTermPool.malloc(sizeof(CustomVector);
CustomVector* results = static_cast<CustomVector*>(allocatedMemory);
new(results) CustomVector(CustomAllocator(shortTemPool));
后来我打电话
shortTermPool.recycle();
这行代码回收所有的内存内存池,允许我重用它。现在,既然矢量和它的分配器都在使用内存池,我是否仍然需要在回收内存池之前调用
results->~vector();
?析构函数是否做了其他任何事情,或者将整个池回收足够吗?
是的。您可以安全地假定,在对象的存储被破坏之前,所有对象都有必须执行的析构器操作。你使用placement new来构造一个对象。所有构建的对象都必须销毁。调用对象的析构函数是实际销毁它的必需部分。 –
假设我不在上面的例子中调用析构函数。内存中为矢量结果留下了什么。内存池中的内存中是否有东西被分配? (假设任何Result *对象也是使用同一个内存池构造的))。 – user1432882
除非调用析构函数,否则会导致未定义的行为。如果你想验证这对你的特定C++实现没有任何不良影响,那么继续吧。但是答案仅限于你的C++实现。调用析构函数不是一项艰巨的任务。这很容易。而且,这将避免意想不到的惊喜,未来,基本容器应该被更复杂的东西所取代。 –