如果容器和分配器都是同一内存池的一部分,我还需要调用std::容器的析构函数吗?
Do I still need to call a destructor of a std::container if both the container and allocator are part of the same memory pool?
(以使用线程构建块内存池为例)
假设我有以下设置:
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();
这行代码回收了内存池中的所有内存,允许我重用它。现在,由于vector和它的分配器都在使用内存池,我还需要调用
吗?results->~vector();
在回收内存池之前?析构函数是否做了任何额外的工作,或者回收整个池是否足够?
来自c++标准:
3.8对象生存期4程序可以通过重用该对象所占用的存储空间或显式地终止该对象的生命周期使用非平凡析构函数调用类类型对象的析构函数。对于具有非平凡析构函数的类类型的对象函数之前显式调用析构函数是不需要的对象占用的存储空间被重用或释放;然而,如果没有显式调用析构函数,也没有delete表达式(5.3.5)不能用于释放存储,析构函数也不能被隐式调用和任何依赖于副作用的程序析构函数产生的行为是未定义的。
它取决于std::vector
析构函数是否是非平凡的并且具有程序所依赖的副作用。因为它是一个标准库类,为了安全起见,建议调用析构函数。否则,你必须检查std::vector
的实现,现在和将来所有你希望你的代码兼容的标准库。
如果vector类是你自己的,你就可以控制析构函数的实现,如果析构函数无关紧要,或者没有程序所依赖的副作用,就可以忽略调用它,如上所述。
相关文章:
- 为什么 std::unique 不调用 std::sort?
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 在调用 std::bind 的产品后意外调用析构函数
- 在抛出 what() 的实例后调用'std::logic_error'终止:basic_string::_M_construct 空无效
- 有没有办法扩展和调用 std::functions 的元组?
- 调用std::函数成员时内存损坏
- 如何在C++03中用自定义谓词调用std::unique
- 未调用 std::unique_ptr 中的自定义删除器
- 从多个线程调用 std::shuffle
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- 访问并调用 std::function 的变体
- 错误:调用 std::thread 没有匹配函数
- 为什么调用shared_from_this调用 std::终止
- C++天鹅座的错误;没有用于调用"std::basic_fstream..."的匹配函数
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 防止线程在处理异常后在分离时调用 std::terminate()
- C++线程中调用 std::terminate 时程序返回代码
- 如果从类成员初始值设定项引发的异常调用 std::terminate()
- 线程是否真的在调用 std::future::get() 后启动