当在另一个对象中更改对象时,如何在C ++中使用析构函数

时间:2013-11-14 07:16:35

标签: c++ destructor

情况是这样的。

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 ++中是否有其他解决此类问题的方法?

4 个答案:

答案 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;
}