0

我一直在编写一个代码,其中有很多类。我在构造函数中为不同的对象数组分配内存。但是,当我认为一切正常时,我遇到了一个奇怪的错误。例如,假设我有一个名为 Points 的类,它有一个名为 data 的双点数组。

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

class Points
{
      double *data;

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

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

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

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

HandTracker.exe 中 0x778f15de 处未处理的异常:0x00000000:操作成功完成。块引用

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

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

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

4

1 回答 1

2

最有可能的是,您在代码中的某处复制了一个实例,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;
}
于 2012-08-08T02:37:57.447 回答