Причина ошибки 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;
}