Russian Qt Forum
Ноябрь 23, 2024, 08:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Правильное освобождение ссылочных полей объекта  (Прочитано 8717 раз)
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #15 : Июнь 04, 2014, 00:20 »

Подождите, вы просили МИНИМАЛЬНЫЙ код иллюстрирующий проблему. Вот он.

Вы ошибаетесь. Это не он. Этот код не иллюстрирует проблему.

Что бы минимальный код мог проиллюстрировать проблему он должен быть реальным.
Воссоздавать картину реального происшествия. Просто не содержать ничего лишнего: такого, что не относится к демонстрации проблемы.

Ну и самое главное, он должен демонстрировать проблему.

...но в первую очередь из-за того, что его МНОГО.

Понятно... что ж, в таком случае остается только эвристика.

Ок, я вас понимаю. Но я спрашивал о том, КАК конкретно проверить указывает ли указатель (масло так маслит Смеющийся)  на свободную память или нет с помощью дебагера если в коде по ходу выполнения НЕТ delet'ов кроме указанного мной в минимальном примере кода?

Самый простой способ - посмотреть в пошаговой отладке на что смотрит указатель. Обычно, если он битый - по указателю будет "непонятная чача".

Первое, что бы я сделал: брякнулся бы в пошаговой отладке перед самой точкой крэша, и в отладчике посмотрел бы: содержатся ли по указателю осмысленные данные. Если нет - указатель однозначно битый.

Цитировать
А попробуйте закомментировать весь код, использующий созданный settings, кроме new/delete и прогнать через valgrind. Интересно, останется ошибка?
ок попробую, напишу результат

Второе, что бы я сделал: в иде запросил бы на имя settings "найти использование".
Во многих случаях это позволяет обнаружить ошибку путем анализа использования без необходимости отключать куски кода.





Записан
UltraPenguin
Гость
« Ответ #16 : Июнь 04, 2014, 19:24 »

Эх. Это действительно ТОТ код на который valgrind дает такое сообщение. Я понимаю что такое "код иллюстрирующий проблему". Подмигивающий
В том то все и дело, что данные там высвечиваются валидные все время работы программы.

Интересный вопрос: что будет показывать дебагер, если память под указателем освобождена, но ОС еще не затерла лежащую по данному адресу инфу?

У меня была подобная ситуация, и на экране дебагера я любовался на верные на первый взгляд данные.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Июнь 05, 2014, 10:06 »

Интересный вопрос: что будет показывать дебагер, если память под указателем освобождена, но ОС еще не затерла лежащую по данному адресу инфу?

У меня была подобная ситуация, и на экране дебагера я любовался на верные на первый взгляд данные.
"Затирание" происходит сразу т.к. ОС вписывает в освобожденный блок связки (типа указатель на след блок)
Код
C++ (Qt)
delete a;
int test = a->data;  // "ведь еще ничего не случилось" - неверно, часть данных уже перетерта
 

Возвращаясь к исходному вопросу - неясно из-за чего сыр-бор. Печатайте счетчики в конструкторе и деструкторе, если они сбиваются - проблемы valgrind
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 23.