如果容器和分配器都是同一个内存池的一部分,我还需要调用std :: container的析构函数吗?

时间:2016-09-18 16:37:24

标签: c++ c++11 memory-management tbb

(在示例中使用线程构建块内存池)

假设我有以下设置:

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();

在回收内存池之前?析构函数是否正在执行任何其他操作,或者将整个池回收是否足够?

1 个答案:

答案 0 :(得分:1)

来自C ++标准:

  

3.8对象生存期

     

4 程序可以通过重用对象占用的存储或明确地重用任何对象的生命周期   使用非平凡的析构函数调用析构函数以获取类类型的对象。   对于具有非平凡析构函数的类类型的对象,   程序不需要在之前显式调用析构函数   对象占用的存储器被重用或释放;但是,如果   没有对析构函数或delete-expression的显式调用   (5.3.5)不用于释放存储,析构者不得   被隐式调用和任何依赖于副作用的程序   由析构函数生成的行为具有不确定的行为。

这取决于std::vector析构函数是否是非平凡的,并且具有程序所依赖的副作用。因为它是一个库类,所以建议调用析构函数是安全的。否则,您现在和将来要检查所有希望代码兼容的标准库的std::vector实现。
如果向量类是您自己的,那么您将控制析构函数实现,如果它是微不足道的,或者没有程序所依赖的副作用,您可以省略调用它,如上所述。
(但我个人也会在这种情况下称之为。)