这里的数组是代码:删除对象
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谢谢,我从未听说过它们。 –