[英]How to implement class destructor with vector of pointers C++
如果我在類中有指針的類和指針矢量,應如何編寫析構函數以適當釋放內存? 這是正確的嗎?
~Class()
{
for(int i = 0; i<v.size(); i++)
{
delete v[i];
}
}
還是我也應該刪除向量中的元素? 或其他解決方案?
~Class()
{
for(int i = 0; i<v.size(); i++)
{
delete v[i];
v.erase(e.begin() + i);
}
}
如果我在類中有指針的類和指針矢量,應如何編寫析構函數以適當釋放內存? 這是正確的嗎?
這取決於。
指針是否指向分配了new
對象,並且此類是這些動態對象的所有者(即,該類負責它們的銷毀)嗎? 如果不是,那是不正確的。
還是我也應該刪除向量中的元素?
您刪除向量元素的示例是錯誤的。 它會跳過一半的元素,因此不會調用delete所有指針。 第一次迭代后,第一個元素將被擦除,因此下一個元素已移至索引0,但是next循環刪除並擦除了索引1中的元素。
刪除向量的元素沒有任何意義,因為它將立即被破壞。
或其他解決方案?
如果您打算讓該類擁有動態分配的對象,則最好使用對象向量而不是指針。 例如,如果需要指針向量來允許運行時多態性,請使用std::unique_ptr
向量。 這樣,您就不需要實現析構函數,因為自動生成就可以了。
如果您的類應該擁有所指向的對象,那么它足以做到:
for (auto p : v) delete p;
如果向量本身是類的成員,則在破壞類實例對象時,其元素將被刪除,您無需手動執行此操作。 在您的示例中,您也做錯了。 如果它是std :: vector,則可以調用vector的clear()方法。 否則,您將調用delete [] p; 其中p是指向向量元素本身的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.