Причина ошибки C++ Destructor при использовании этого указателя?

Я работал над кодом, в котором у меня много классов. Я выделяю память для различных массивов объектов в конструкторе. Однако у меня была странная ошибка, пока я думал, что все в порядке. например, скажем, у меня есть класс с именем Points, и у него есть двойной массив точек с именем data.

Хорошо, я выкладываю весь код сейчас:

class Points
{
      double *data;

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

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

После отладки я обнаружил, что ошибка была с указателем this, который я не знаю, почему это так? Деструктор вызывается для удаления данных, пока объект уничтожается, но он все еще находится в памяти. Мой вопрос: почему это так?

Я получаю ошибку в основном из-за неправильного обращения с памятью

Необработанное исключение в 0x778f15de в HandTracker.exe: 0x00000000: операция успешно завершена. Blockquote

Ошибка исправлена, если я удаляю этот указатель, то есть, если я использую следующий деструктор

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

Мой вопрос не совсем о том, как справиться с утечками памяти, а об этой конкретной проблеме, связанной с этим указателем. Каков механизм этого указателя, который заставляет его выдавать эту ошибку?

1 ответ

Решение

Скорее всего, где-то в вашем коде вы скопировали экземпляр 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;
}
Другие вопросы по тегам