情况是这样的。
class Class1{
public:
Class1(int N){
p = new int [N];
}
~Class1(){
delete []p;
}
...
private:
int *p;
};
class Class2(){
public:
Class2(){
int N = somthing;
A = Class1(N);
...
}
...
private:
Class1 A;
}
基本上,Class2是一个复杂的对象,它使用Class1作为其中的一部分并将更改它。 问题是,如果我这样做,Class1的析构函数将导致错误。
C ++中是否有其他解决此类问题的方法?
答案 0 :(得分:1)
删除NULL指针是无操作且安全的。因此,在销毁之前将Class1::p
设置为NULL
可以解决问题。
答案 1 :(得分:1)
一个明显的问题是,您有一个管理资源的类Class1
,但它不能安全地复制和分配。任何副本或赋值都会导致多个实例尝试删除同一个数组,因为所有实例都会有指向一个数组的指针。如果您的类旨在拥有该资源,则需要提供复制构造函数和赋值运算符。这通常称为the rule of three。
答案 2 :(得分:0)
您正在将数组删除运算符与单个对象new运算符混合。现在代码new是一个整数,其值被构造为N.而不是N个整数的数组。你需要使用数组new运算符。
From:
p = new int (N); /* allocate int initialized to N */
To:
p = new int [N]; /* allocate N int's */
答案 3 :(得分:-2)
你可能希望你的class2写得像这样:
class Class2(){
public:
Class2(){
int N = somthing;
A = new Class1(N);
...
}
~Class2() {
if (NULL != A) {
delete A;
A = NULL;
}
}
...
private:
Class1 *A;
}