0

情况是这样的。

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

4 回答 4

1

删除 NULL 指针是无操作且安全的。因此,设置Class1::pNULL前销毁可以解决问题。

于 2013-11-14T07:20:20.650 回答
1

一个明显的问题是您有一个管理资源的类Class1,但它不能安全地复制和分配。任何复制或赋值都会导致多个实例试图删除同一个数组,因为所有实例都有指向一个数组的指针。如果您的类打算拥有该资源,则需要提供一个复制构造函数和一个赋值运算符。这就是通常所说的三法则

于 2013-11-14T07:41:40.387 回答
0

您将数组删除运算符与单个对象新运算符混合在一起。现在代码 new 是一个整数,它的值被构造为 N。不是 N 个整数的数组。您需要使用数组 new 运算符。

From:
 p = new int (N); /* allocate int initialized to N */

To:
 p = new int [N]; /* allocate N int's */
于 2013-11-14T07:23:30.567 回答
-2

你可能希望你的 class2 像这样写:

class Class2(){
public:
    Class2(){
        int N = somthing;
        A = new Class1(N);
      ...
    }
    ~Class2() {
        if (NULL != A) {
            delete A;
            A = NULL;
         }
    }
   ...
private:
    Class1 *A;
}
于 2013-11-14T07:25:26.480 回答