2017-08-09 59 views
3

我有一個簡單的結構,它有固定的大小和包含內置類型。我通過分配內存塊來創建內存池,並將此內存分割爲我的結構體大小的塊。然後它使用placement new來調用特定內存塊上的構造函數以使用默認值初始化一些成員。然後我想通過調用delete []運算符來釋放整個內存塊。我可以安全地跳過顯式的析構函數調用,每個對象使用新的位置初始化嗎?我沒有在該類的其他成員字段的構造函數或構造函數內找到任何資源。我只想釋放整個內存塊。安置新的和破壞者

+7

請顯示您的代碼,而不是解釋它。 –

+1

目前尚不十分清楚你到底在做什麼,但通常情況下,你可以跳過運行析構函數,當且僅當該對象是可破壞的。 –

+1

@BaummitAugen在這種情況下,優化器將無論如何都會這樣做,所以我們不應該真的考慮它 –

回答

5

你可以跳過調用析構函數,如果它是瑣碎

A trivial destructor is a destructor that performs no action. Objects with trivial destructors don't require a delete-expression and may be disposed of by simply deallocating their storage.

如果你可以告訴類型使用std::is_trivially_destructible<Type>::value表達平凡破壞。如果你使用優化進行編譯,大多數優化器都會爲你解決這個問題,所以編寫一個循環來調用塊中所有對象的瑣碎析構函數不會有性能上的負擔。

+1

不僅可以使用'std :: is_trivially_destructible <>'來確定它是否正常。你真的應該在'static_assert()'中使用它,以確保有人在6個月內沒有向結構中添加「字符串」,或者像這樣愚蠢。 – Frank

+0

如果struct或其任何成員具有顯式定義的析構函數但空體? – user7242858

+1

@ user7242858任何顯式提供的析構函數都被認爲是微不足道的,即使它的主體是空的。 – dasblinkenlight