(例如,在使用線程構建模塊的內存池)如果容器和分配器都是同一個內存池的一部分,我還需要調用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++實現。調用析構函數不是一項艱鉅的任務。這很容易。而且,這將避免意想不到的驚喜,未來,基本容器應該被更復雜的東西所取代。 –