我有这堂课:
class A{
private:
int * intArr;
int countInt;
public:
A(){
countInt=0;
}
SetArray(countInt){
intArr=new int[countInt];
}
~A(){
delete []intArr;
}
};
我也有这堂课:
#define MAX_SIZE 10
class B{
private:
A * Aelements;
public:
B(){
int num;
Aelements=new A[MAX_SIZE];
//reading number from file
//....
//num=something
for(int i=0;i<MAX_SIZE;i++)
Aelements[i].SetArray(num);
}
static void test(){
try{
B b;
//do something...
} //here supposed to call ~A()
catch(){
//handle errors....
}
};
类B
使用A
默认构造函数创建A
元素数组,然后调用SetArray()
为每个{{1}创建int
数组元素。
我的问题是:
当我致电A
时,它不会拨打B::test()
。在~A()
完成时,应该调用A
的析构函数。
如果我通过try{}
强制调用它,那么
~B()
我在致电~B()
{
delete [] Aelements; //Calling ~A()
}
后(~A()
完成时)收到此消息:
调试断言失败! _BLOCK_TYPE_IS_VALID(pHead-&GT; nBlockUse)
如何以正确的方式使用析构函数?
答案 0 :(得分:0)
使用new
表达式创建的对象一直存在,直到它被delete
表达式(或等效代码)销毁。
您没有任何delete
表达式或为您执行此操作的对象,因此new
- ed对象只会继续存在。
直接修复将使用诸如std::unique_ptr
之类的智能指针而不是原始指针。更好的解决方法是使用std::vector
而不是DIY原始数组。这些修补程序以不同方式负责复制:std::unique_ptr
禁用复制(可以移动但不复制),而std::vector
支持复制。