使用此指针时出现C++析构函数错误的原因



我一直在研究一个代码,其中有很多类。我正在将内存分配给构造函数中的不同对象数组。然而,当我认为一切都很好时,我遇到了一个奇怪的错误。举个例子,假设我有一个名为 Points 的类,它有一个称为 data 的双精度点数组。

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

class Points
{
      double *data;
      Points::Points()
      { 
           data = new double [C_NUMBER_OF_POINTS];
      }
      Points::~Points()
      {
           delete [] this->data;
      }
};

调试后,我发现错误出在this指针上,我不知道为什么会这样?调用析构函数以删除数据,同时销毁对象,但它仍在内存中。我的问题是为什么会这样?

我得到的错误基本上是由于内存处理不当造成的

在手持追踪器.exe 0x778f15de时出现未经处理的异常: 0x00000000: 操作已成功完成。 块引用

如果我删除此指针,则错误已修复,这意味着如果我使用以下析构函数

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

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

最有可能的是,在代码中的某个地方,您复制了Points的实例或从引用构造了一个实例到另一个实例。这将使用相同的data指针创建类的两个实例。当第一个实例被销毁时,它销毁了两个实例都有指针的对象。当第二个被访问或销毁时,它导致了问题,因为对象已经消失了。

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

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

试试这个:

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;
}

最新更新