析构函数错误

时间:2015-01-11 14:48:22

标签: c++ visual-studio-2010 class destructor

我有这堂课:

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数组元素。

我的问题是:

  1. 当我致电A时,它不会拨打B::test()。在~A()完成时,应该调用A的析构函数。

  2. 如果我通过try{}强制调用它,那么

    ~B()

    我在致电~B() { delete [] Aelements; //Calling ~A() } 后(~A()完成时)收到此消息:

      

    调试断言失败!      _BLOCK_TYPE_IS_VALID(pHead-&GT; nBlockUse)

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

1 个答案:

答案 0 :(得分:0)

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

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

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