Ошибка неверного указателя при удалении, но другой указатель - PullRequest
1 голос
/ 23 февраля 2012

Моя программа падает с неверным указателем.Когда я запускаю с ним gdb, он сообщает мне адрес неверного указателя, вызвавшего сбой.Строка, на которой происходит сбой, - это

delete some_pointer;

Но когда я распечатываю указатель прямо перед его удалением, адрес не совпадает с адресом, указанным мне GDB недействительнымТак что это тот, который я удаляю, когда он падает, а не указатель, вызывающий проблему?GDB говорит -

free(): invalid pointer: 0xbfffea84 ***

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

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

Если у вас есть класс с множественным наследованием, адрес будет корректироваться в зависимости от типа указателя. free потребуется использовать базовый тип, но компилятор должен уметь делать правильное преобразование незаметно за сценой.

0 голосов
/ 23 февраля 2012

Почти наверняка, указатель был delete d до удаления, которое вы просматриваете. Удаление указателя дважды вызывает точно описанные симптомы.

0 голосов
/ 23 февраля 2012

Если у вас есть что-то вроде этого:

struct S
{
   int* p;
   ~S() { delete p;}
};

S* s;
std::cout << (void*)s;
delete s;

Возможно, ваша программа потерпит крах при удалении p, но будет напечатано s. Скорее всего, они будут другими.

...