2015-01-11 63 views
-1

我有这个类:析构函数错误

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

我的问题是:

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

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

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

    我得到这个消息调用~A()(当try{}完成)后:

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

如何使用析构函数的正确方法是什么?

+1

1.为什么要调用'A〜()'?你还没有删除动态分配的'A'数组。 2.显示一些导致失败的代码。最有可能的是,你需要遵循*三条规则*。 – juanchopanza

+1

对于C++来说,这很多'new'和'delete'。你有没有考虑过使用标准容器? – Biffen

+0

标准容器是什么意思? – user3572267

回答

0

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

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

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