[英]Delete vector class member
我有一個帶有成員的A類,它是另一個B類的對象指針的向量
class A
{
std::vector<B*> m_member_A
通過使用new
運算符創建B的對象來填充m_member_A
B* b1 = new B;
m_member_A.push_back(b1);
在A的析構函數中,以下是否正確釋放所有內容?
A::~A()
{
for(int i = 0; i < m_member_A.size(); ++i)
{
delete m_member_A[i];
}
m_member_A.clear();
}
這是正確的,只要你還有一個正確的復制構造函數和復制賦值運算符,每三個規則 。 請注意, clear()
是多余的,因為向量的析構函數將釋放其內存。
你為什么亂搞指針和new
? 為什么不遵循Zero規則,如果需要指向多態的指針,請使用vector<B>
或vector<unique_ptr<B>>
? 那么你根本不需要擔心析構函數,復制構造函數或復制賦值運算符; 你將獲得移動語義作為獎勵。
是的,這是正確的......但還不夠。
每當復制A
時,您還需要對容器進行深層復制。
如果你可以在向量中使用智能指針,那就更好了。 在你的頭腦和你的代碼中明確誰擁有什么。
幾乎
如果在A的構造函數中構造(分配)B的元素,並且某些B拋出異常,則會發生內存泄漏(除非它在A的構造函數中被捕獲,其中B的刪除已完成)
而通常的三條規則。
可能有一些插圖(請將MAKE_FAILURE調整為0或1):
#include <iostream>
#include <stdexcept>
#include <vector>
#define MAKE_FAILURE 0
static unsigned count;
const unsigned ExceptionThreshold = 3;
struct B {
B() { if(ExceptionThreshold <= count++) throw std::runtime_error("Sorry"); }
~B() { std::cout << "Destruct\n"; }
};
struct A
{
std::vector<B*> v;
A()
{
for(unsigned i = 0; i < ExceptionThreshold + MAKE_FAILURE; ++i)
v.push_back(new B);
}
~A()
{
for(unsigned i = 0; i < v.size(); ++i) {
delete v[i];
}
}
};
int main()
{
A a;
return 0;
}
你也可以進入淺層和深層復制的地形(如Orb的@Lightness Races所述)
這是在m_member_A向量中釋放動態分配對象的內存的正確方法。 你實際上不需要打電話:
m_member_A.clear();
std :: vector將自己釋放內存。
如果您可以使用C ++ 11,那么我建議更改為shared_ptr:
std::vector<std::shared_ptr<B>> m_member_A
現在你不需要自己釋放記憶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.