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

C++ 如果容器和分配器都是同一个内存池的一部分,我还需要调用std::container的析构函数吗?,c++,c++11,memory-management,tbb,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 shortTer

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

假设我有以下设置:

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));
这行代码回收了内存池中的所有内存,允许我重用它。既然向量和它的分配器都在使用内存池,我还需要调用吗

results->~vector();
在回收内存池之前?析构函数是否做了额外的事情,还是将整个池的回收都足够了?

< P>从C++标准:

3.8对象寿命

4程序可以通过重用对象占用的存储器或通过显式地 为具有非平凡析构函数的类类型的对象调用析构函数。 对于具有非平凡析构函数的类类型的对象 程序不需要在调用之前显式调用析构函数 对象占用的存储被重复使用或释放;然而,如果 没有显式调用析构函数,或者如果删除表达式 (5.3.5)不用于释放存储,则销毁器不得 隐式调用和任何依赖于副作用的程序 由析构函数生成的具有未定义的行为

它取决于
std::vector
析构函数是否是非平凡的,是否具有程序依赖的副作用。因为它是一个库类,所以建议调用析构函数以确保安全。否则,您必须在现在和将来检查
std::vector
实现,以查找您希望代码与之兼容的所有标准库。
如果vector类是您自己的,那么您将控制析构函数实现,并且如果它是微不足道的,或者没有程序依赖的副作用,您可以省略调用它,如上所述。

(但就我个人而言,在这种情况下我也会这样称呼。)

是的。您可以安全地假设,在对象的存储被销毁之前,所有对象都必须执行析构函数操作。使用“新放置”来构造对象。必须销毁所有构造的对象。调用对象的析构函数是实际销毁它所必需的一部分。内存中为向量结果保留的内容。在内存池之外的向量内部是否分配了一些内容?(假设任何Result*对象也使用相同的内存池构造))。除非调用析构函数,否则将导致未定义的行为。如果您想验证,这将不会对您的特定C++实现产生不良影响,请继续前进。但答案将仅限于C++实现。调用析构函数不是一项艰巨的任务。这很容易。而且,如果将来基本容器被更复杂的东西取代,这将避免意外的惊喜。仅供参考:
std::vector
的析构函数非常重要,符合标准的要求。
results->~vector();