Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очистка мусора с дебаггером и без него, разные результаты 
:(
    Опции темы
Nuzur
Дата 15.1.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Суть проблемы заключается  в том, что при дебаге(F5) у меня мусор уберается просто идеальном, а вот при запущеном приложении(CTRL + F5) падает из-за невалидности указателей. Я понимаю что звучит странно но  я незнаю как спросить иначе.

Структура имеет вид:

Код

struct Color
{
public:
    CString Red, Green, Blue;
    CString Channel;
};
typedef Color * ColorPtr;
typedef CSimpleArray<ColorPtr> ColorArray;
typedef ColorArray * ColorArrayPtr;
typedef CSimpleMap<CString, ColorArrayPtr> CmapIdColor;

CmapIdColor mapIdColor;


убираю мусор:
Код

    int i,j,k;
    for(i = 0; i < mapIdColorRTU.GetSize(); i++)
    {
        for(j = 0; j < mapIdColorRTU.GetValueAt(i)->GetSize(); j++)
            for(k = 0; k < mapIdColorRTU.GetValueAt(i)[j].GetSize(); k++)
            {
                delete (ColorPtr)mapIdColorRTU.GetValueAt(i)[j][k]; // здеся вот валиться :(
            }

        mapIdColorRTU.GetValueAt(i)->RemoveAll();
        delete mapIdColorRTU.GetValueAt(i);
    }



--------------------
Never again...
PM MAIL   Вверх
Earnest
Дата 15.1.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Скорее всего в этих указателях что-то нехорошее (неинициализированы). При дебаге вполне там могут быть нули. Так что смотри там, где инициализируешь указатели на Color. Например, если ты увеличиваешь размер массива указателей, но не инициализируешь все новые значения, там вполне может быть грязь. Что-то вроде этого.




--------------------
...
PM   Вверх
Nuzur
Дата 15.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Earnest, Нет все указатели инициализированны, я смотрю дебагом в значения что по них лежат, там все правельно.
Очистку провожу в деструкторе ксатити, екзеплер переменной лежит в MainFrame в разделе private.


--------------------
Never again...
PM MAIL   Вверх
Earnest
Дата 15.1.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Но ведь релиз говорит тебе, что указатель невалидный...
Попробуй распечатывать значения перед удалением и ищи где лажа...


--------------------
...
PM   Вверх
Nuzur
Дата 16.1.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Earnest, да мне не релиз а дебаг версия говорит что лажа. А что печатать? Сам указатель? Ну и понту мне с него, тоесть с адреса его, тоесть с адреса на который он указывает?
Я знаю что он не валидный! Но почему при F5, тоесть когда я с прожкой запускаю дебаггер то все чудесно, цветочки, мир ии все друг-друга любят, все валидны и счастливы! А вот когда CTRL + F5 то все счастливы до деструктора а потом приходят невалидные указатели и ламают всем(тоесть мне) кайф!

Пойду куплю веревку, уже 4 день еб... мучаюсь и ничего не выходит smile



--------------------
Never again...
PM MAIL   Вверх
Earnest
Дата 16.1.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



А, оба раза дебаг? Не надо вешаться, все там были. Главное, всегда помнить: мистики нет, есть ошибка.
Терпи и вырабатывай интуицию... потом позвоночником начнешь ошибки искать...

Распечатывай, конечно, содержимое... хотя и по значению указателя иногда видно, что он левый... 
Я полагаю, что указатели портятся где-то еще, т.к. приведенный тобою код удаления вроде нормальный.
В зависимости от величины программы, я бы попробовала (в следующем порядке): 
1) просмотреть код, который теоретически может портить указатели и попытаться логически найти ошибку
2) комментировать другие куски кода (оставляя заглушки вместо нужных функций), пока не обнаружится тот, кто приводит к порче. Начать с комментирования всего, кроме создания и удаления.
3) Используя ф-ю heapwalk написать проверку валидности указателей в массивах. Затем вставлять ее в разных точках и искать, где портится.




--------------------
...
PM   Вверх
_hunter
Дата 16.1.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



ну и я свои 5 копеек вставлю: есть такая замечательная програмка BoundsChecker. она, кроме всего прочего, умеет и неправильные операции над указателями отслеживать...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Nuzur
Дата 17.1.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Earnest, суть в том что при обращении к невалидному указателю все завалиться, тоесть я не могу посмотреть "Что же там".
Код сейчас составляет загрузку их xml и при завершении программы выгрузку в xml изменений,  Которых небыло. Тоесть испортиться если он создался его может только винда и любимая студия.
Тоесть я создаю в памяти сию структуру(и я ее создаю и пишу в нее правильные значения так говорит великий дебаггер), а потом жестоко уничтожаю при закрытии программы(и по словам тоже авторитета дебаггера это у меня все правильно тоже).
Но вот косяк я не могу конечному пользователю об'яснить что ему надо будет запускать прогу теперь из под дебагерра smile точнее могу но тим-лидер тогда научит меня тому чему я учиться не хочу, ибо я свято убежден что мне не понравиТЬся.

По существу. 1 - сейчас и знамаюсь. 2 не столько еще наворотил 3. Можна ли поподробнее?


_hunter, Спасибо не знал етого. Щя буду ставить.


--------------------
Never again...
PM MAIL   Вверх
Nuzur
Дата 17.1.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Нашел где косяк. Не могу понять почему!
Код

for(j = 0; j < mapIdColorRTU.GetValueAt(i)->GetSize(); j++)

 
вызывается на 1-н раз больше чем надо! Там записываю одно значение, функцией Add а в деструкторе вызывается два!
Не понимаю почему smile


--------------------
Never again...
PM MAIL   Вверх
Earnest
Дата 18.1.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Nuzur @  17.1.2007,  13:45 Найти цитируемый пост)
суть в том что при обращении к невалидному указателю все завалиться, тоесть я не могу посмотреть "Что же там".

Вовсе не всегда, только если указатель показывает в защищенную область, но тогда это по указателю видно.

Цитата(Nuzur @  17.1.2007,  13:45 Найти цитируемый пост)
Тоесть испортиться если он создался его может только винда и любимая студия.

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

Цитата(Nuzur @  17.1.2007,  19:35 Найти цитируемый пост)
вызывается на 1-н раз больше чем надо

Кто именно? В mapIdColorRTU лишние значения? Или в его значениях?
Сам цикл подозрений не вызывает - он работает столько раз, сколько говорит GetSize - если, конечно ты внутри цикла не химичишь с размером массива. Стало быть, ищи где лишнее значение туда попадает. Может, когда ты Add вызываешь, там что-то уже есть? Выводи размер при добавлении и при удалении.


--------------------
...
PM   Вверх
Nuzur
Дата 22.1.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Нашел багу smile хорошо что заболел и немного голова разгрузилась, а то месяцами бы в код смотрел smile

Earnest и _hunter жду вас господа smile

короче, вместо
Код

    int i,j,k;
    for(i = 0; i < mapIdColorRTU.GetSize(); i++)
    {
        for(j = 0; j < mapIdColorRTU.GetValueAt(i)->GetSize(); j++)
            for(k = 0; k < mapIdColorRTU.GetValueAt(i)[j].GetSize(); k++)
            {
                delete (ColorPtr)mapIdColorRTU.GetValueAt(i)[j][k]; // здеся вот валиться :(
            }
        mapIdColorRTU.GetValueAt(i)->RemoveAll();
        delete mapIdColorRTU.GetValueAt(i);
    }


Нужно было
Код

    int i,j;
    for(i = 0; i < mapIdColorRTU.GetSize(); i++)
    {
        for(j = 0; j < mapIdColorRTU.GetValueAt(i)->GetSize(); j++)
        {
            delete (*mapIdColorRTU.GetValueAt(i))[j];

        }
    }


И ничего не валится. Хотя муть-то полная, а вот кто пояснит мне почему срабатывало когда было неправильно!? Ведь не долно ж юыло так работать! Я уже совсем запутался smile

Это сообщение отредактировал(а) Nuzur - 22.1.2007, 18:39


--------------------
Never again...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.