| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Очистка мусора с дебаггером и без него |
| Автор: Nuzur 15.1.2007, 17:41 | ||||
| Суть проблемы заключается в том, что при дебаге(F5) у меня мусор уберается просто идеальном, а вот при запущеном приложении(CTRL + F5) падает из-за невалидности указателей. Я понимаю что звучит странно но я незнаю как спросить иначе. Структура имеет вид:
убираю мусор:
|
| Автор: Earnest 15.1.2007, 18:47 |
| Скорее всего в этих указателях что-то нехорошее (неинициализированы). При дебаге вполне там могут быть нули. Так что смотри там, где инициализируешь указатели на Color. Например, если ты увеличиваешь размер массива указателей, но не инициализируешь все новые значения, там вполне может быть грязь. Что-то вроде этого. |
| Автор: Nuzur 15.1.2007, 18:59 |
| Earnest, Нет все указатели инициализированны, я смотрю дебагом в значения что по них лежат, там все правельно. Очистку провожу в деструкторе ксатити, екзеплер переменной лежит в MainFrame в разделе private. |
| Автор: Earnest 15.1.2007, 19:03 |
| Но ведь релиз говорит тебе, что указатель невалидный... Попробуй распечатывать значения перед удалением и ищи где лажа... |
| Автор: Nuzur 16.1.2007, 10:30 |
| Earnest, да мне не релиз а дебаг версия говорит что лажа. А что печатать? Сам указатель? Ну и понту мне с него, тоесть с адреса его, тоесть с адреса на который он указывает? Я знаю что он не валидный! Но почему при F5, тоесть когда я с прожкой запускаю дебаггер то все чудесно, цветочки, мир ии все друг-друга любят, все валидны и счастливы! А вот когда CTRL + F5 то все счастливы до деструктора а потом приходят невалидные указатели и ламают всем(тоесть мне) кайф! Пойду куплю веревку, уже 4 день еб... мучаюсь и ничего не выходит |
| Автор: Earnest 16.1.2007, 18:09 |
| А, оба раза дебаг? Не надо вешаться, все там были. Главное, всегда помнить: мистики нет, есть ошибка. Терпи и вырабатывай интуицию... потом позвоночником начнешь ошибки искать... Распечатывай, конечно, содержимое... хотя и по значению указателя иногда видно, что он левый... Я полагаю, что указатели портятся где-то еще, т.к. приведенный тобою код удаления вроде нормальный. В зависимости от величины программы, я бы попробовала (в следующем порядке): 1) просмотреть код, который теоретически может портить указатели и попытаться логически найти ошибку 2) комментировать другие куски кода (оставляя заглушки вместо нужных функций), пока не обнаружится тот, кто приводит к порче. Начать с комментирования всего, кроме создания и удаления. 3) Используя ф-ю heapwalk написать проверку валидности указателей в массивах. Затем вставлять ее в разных точках и искать, где портится. |
| Автор: _hunter 16.1.2007, 18:19 |
| ну и я свои 5 копеек вставлю: есть такая замечательная програмка BoundsChecker. она, кроме всего прочего, умеет и неправильные операции над указателями отслеживать... |
| Автор: Nuzur 17.1.2007, 12:45 |
| Earnest, суть в том что при обращении к невалидному указателю все завалиться, тоесть я не могу посмотреть "Что же там". Код сейчас составляет загрузку их xml и при завершении программы выгрузку в xml изменений, Которых небыло. Тоесть испортиться если он создался его может только винда и любимая студия. Тоесть я создаю в памяти сию структуру(и я ее создаю и пишу в нее правильные значения так говорит великий дебаггер), а потом жестоко уничтожаю при закрытии программы(и по словам тоже авторитета дебаггера это у меня все правильно тоже). Но вот косяк я не могу конечному пользователю об'яснить что ему надо будет запускать прогу теперь из под дебагерра По существу. 1 - сейчас и знамаюсь. 2 не столько еще наворотил 3. Можна ли поподробнее? _hunter, Спасибо не знал етого. Щя буду ставить. |
| Автор: Nuzur 17.1.2007, 18:35 | ||
Нашел где косяк. Не могу понять почему!
вызывается на 1-н раз больше чем надо! Там записываю одно значение, функцией Add а в деструкторе вызывается два! Не понимаю почему |
| Автор: Nuzur 22.1.2007, 11:25 | ||||
| Нашел багу Earnest и _hunter жду вас господа короче, вместо
Нужно было
И ничего не валится. Хотя муть-то полная, а вот кто пояснит мне почему срабатывало когда было неправильно!? Ведь не долно ж юыло так работать! Я уже совсем запутался |