這裏的數組是代碼:刪除對象
class A {
private:
int *anArr;
int id;
public:
A() {
id = 0;
anArr = new int[10];
}
A(int i) {
id = i;
anArr = new int[10];
}
~A() {
delete[] anArr;
std::cout << "Class A id : " << id << " destructor" << std::endl;
}
};
class B {
private:
A *anArr;
public:
B() {
anArr = new A[10];
}
~B() {
std::cout << "Class B destructor" << std::endl;
delete[] anArr;
}
void changeAnElement() {
anArr[2] = A(1);
anArr[2] = A(2);
}
};
int main()
{
B b;
b.changeAnElement();
return 0;
}
輸出:
Class A id : 1 destructor
Class A id : 2 destructor
Class B destructor
Class A id : 0 destructor
Class A id : 0 destructor
Class A id : 0 destructor
Class A id : 0 destructor
Class A id : 0 destructor
Class A id : 0 destructor
Class A id : 0 destructor
// Gives heap error here
所以,如果我沒有錯,當我改變對象數組的元素就不會調用析構函數。 我的第一個問題是在更改後的索引處發生的舊對象發生了什麼?它中的數組是否泄漏?我認爲我需要自己調用析構函數來防止內存泄漏,但它會產生堆錯誤。 第二個問題是我得到堆錯誤(Expression: _CrtlsValidHeapPointer(block)
)呼籲改變的對象的析構函數時。我不知道爲什麼,它適用於在構造函數中創建的。 謝謝!
請注意,如果你是在類的手工做內存管理,你需要遵循的3或5 – NathanOliver
我想象的規則,'anArr [0] = A(1)'等同於'anArr [0] .operator =(A(1))',它將構建一個新的'id'爲'1',用'A,id = 1'調用'anArr [0]'的拷貝構造函數,然後破壞'A,id = 1'。 A :: operator ='的默認實現不會爲你管理你的內存,所以你會泄漏。解決方案:實現複製構造函數或使用'std :: vector' /'std :: array' – lcs
@NathanOliver謝謝,我從未聽說過它們。 –