0

我一直在研究一个代码,其中有很多类。我将内存分配给构造函数中不同的对象数组。然而,当我认为一切正常时,我遇到了一个奇怪的错误。例如,假设我有一个名为Points的类,它有一个称为数据的双点数组。使用此指针时C++析构函数错误的原因是什么?

好吧,我现在发布的所有代码:

class Points 
{ 
     double *data; 

     Points::Points() 
     { 
      data = new double [C_NUMBER_OF_POINTS]; 
     } 

     Points::~Points() 
     { 
      delete [] this->data; 
     } 
}; 

调试我发现错误是与此指针后,我不知道为什么要这样?调用析构函数删除数据,而对象正在销毁,但它仍在内存中。我的问题是为什么它是这样的?

我得到的错误基本上是由于HandTracker.exe的内存处理不当

在0x778f15de未处理的异常:00000000: 操作成功完成。 大段引用

,如果我,如果我使用下面的析构函数中删除这个指针意义上的错误被修正

 Points::~Points() 
     { 
      delete []data; 
     } 

我的问题是不完全有关如何处理内存泄漏,它是关于与有关这一特定问题这个指针。这个指针背后的机制是什么使它产生这个错误?

+1

请张贴准确的代码 - 在您的示例数据不是类 – 2012-08-08 01:46:28

+7

的成员,您是否按照[三种规则(http://stackoverflow.com/questions/ 4172722 /什么,是最规则的三)? – 2012-08-08 01:47:40

回答

2

很可能,在您的代码的某处,您复制了Points的实例或构建了一个引用到另一个实例。这与你的类创建了两个实例,指针为data。当第一个被销毁时,它销毁了两个实例都有指针指向的对象。当第二个被访问或销毁时,它引发了这个问题,因为该对象已经不存在了。

最好的解决方法是通过使用经过良好测试的类具有自己的析构函数来避免析构函数。例如,在这种情况下,std::array(或std::vector)。这将使一切“神奇地工作”,因为这些类已经有适当的析构函数,复制构造函数和复制赋值运算符。

否则,请确保您有正确的复制构造函数和复制赋值运算符,因为默认值(成员复制/复制)在您的情况下不起作用。请参阅詹姆斯麦克奈利斯关于三项规则的评论。

试试这个:

Points::Points(const Points &a) 
{ 
    data = new double[C_NUMBER_OF_POINTS]; 
    for (int i = 0; i < C_NUMBER_OF_POINTS; ++i) 
      data[i] = a.data[i]; 
} 

Points& operator=(const Points& a) 
{ // The key is that this overrides the catastrophic default -- data=a.data; 
    for (int i = 0; i < C_NUMBER_OF_POINTS; ++i) 
      data[i] = a.data[i]; 
    return *this; 
} 
+1

我可能会建议在'std :: vector'上使用'std :: valarray'或(如果C++ 11)'std :: array'。 – oldrinb 2012-08-08 02:41:56

+1

是的,用固定大小的数组可能会更好。我会更新。 – 2012-08-08 02:43:15

相关问题