析构函数错误



我有这个类:

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() 为每个A元素创建int数组。

我的问题是:

  1. 当我打电话给B::test()时,它不会打电话给~A()。对A析构函数的调用应该在try{}完成时发生。

  2. 如果我强行调用它,通过使~B()

    ~B()
    {
      delete [] Aelements; //Calling ~A()
    }
    

    我在调用~A()后收到此消息(当try{}完成后):

    调试断言失败! _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

如何以正确的方式使用析构函数?

使用 new 表达式创建的对象一直存在,直到它被delete表达式(或等效代码)销毁。

您没有任何delete表达式或为您执行此操作的对象,因此new -ed 对象将继续存在。

直接解决方法是使用智能指针(如 std::unique_ptr)而不是原始指针。更好的解决方法是使用 std::vector 而不是 DIY 原始数组。这些修复以不同的方式负责复制:std::unique_ptr禁用复制(可以移动但不能复制),而std::vector支持复制。

最新更新