Здравствуйте, Orlena, Вы писали:
O>При программировании на С++ (win98) случилось переполнение памяти. Какой ф-цией можно найти то место, в котором это происходит?
Эээ... Имеется ввиду переполнение стэка, или ошибка при динамическом выделении нового блока? Или что-то еще?
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Orlena, Вы писали:
O>>При программировании на С++ (win98) случилось переполнение памяти. Какой ф-цией можно найти то место, в котором это происходит?
B>Эээ... Имеется ввиду переполнение стэка, или ошибка при динамическом выделении нового блока? Или что-то еще?
В программе всего много... подозрение падает на динам.память
B>Чего это всего в ней много? И почему подозрение падает именно на динамическую память? Какие хоть симптомы?
Прошу прощения за долгий ответ... инет...
Использую BounChecker...
если долго не распространяться ,то он указывает на
x=new (...);
хотя есть у меня delete [] x;
а также используются ф-ции heaplock free... соответственно. Думала, что имеются некие ф-ции, позволяющие выдавать message, что мол память переполнена... я просто не могу отыскать в каком месте это происходит, может быть просто не в том месте удаляю выделенную память...
Надеюсь, что понятно...
z = new BYTE [iImageImgWidth*iImageImgHeight];
...delete [] z;
А также: сlrLineIntensImage = (COLORREF*)HeapAlloc( hCurProcess, HEAP_ZERO_MEMORY, sizeof(COLORREF)*iImageImgWidth + 5 );
...HeapFree( hCurProcess, 0, clrLineIntensImage );
Re[6]: Переполнение памяти...
От:
Аноним
Дата:
25.11.03 17:12
Оценка:
Здравствуйте, Orlena, Вы писали:
O>ДА, если быть точнее ... такие ф-ции:
O>z = new BYTE [iImageImgWidth*iImageImgHeight]; O>...delete [] z; O>А также: сlrLineIntensImage = (COLORREF*)HeapAlloc( hCurProcess, HEAP_ZERO_MEMORY, sizeof(COLORREF)*iImageImgWidth + 5 ); O>...HeapFree( hCurProcess, 0, clrLineIntensImage );
Ыыыы... А Вы бы не могли описать, что именно происходит? new выкидывает bad_alloc? HeapAlloc возвращает NULL? Программа умирает по access violation? Форматируется винчестер?
А>Ыыыы... А Вы бы не могли описать, что именно происходит? new выкидывает bad_alloc? HeapAlloc возвращает NULL? Программа умирает по access violation? Форматируется винчестер?
Программа умирает в процессе работы и идёт restart, а иногда просто зависает комп и всё... Те ф-ции которые я привела в качестве примера — не единственные, на которые указывает BChecker...
Здравствуйте, Orlena, Вы писали:
B>>Чего это всего в ней много? :) И почему подозрение падает именно на динамическую память? Какие хоть симптомы? O>Прошу прощения за долгий ответ... инет... O>Использую BounChecker... O>если долго не распространяться ,то он указывает на O>x=new (...); O>хотя есть у меня delete [] x; O>а также используются ф-ции heaplock free... соответственно. Думала, что имеются некие ф-ции, позволяющие выдавать message, что мол память переполнена... я просто не могу отыскать в каком месте это происходит, может быть просто не в том месте удаляю выделенную память... O>Надеюсь, что понятно...
Может, у тебя new вызывается несколько раз, а delete — один?
Здравствуйте, Orlena, Вы писали:
O>ДА, если быть точнее ... такие ф-ции:
O>z = new BYTE [iImageImgWidth*iImageImgHeight]; O>...delete [] z; O>А также: сlrLineIntensImage = (COLORREF*)HeapAlloc( hCurProcess, HEAP_ZERO_MEMORY, sizeof(COLORREF)*iImageImgWidth + 5 ); O>...HeapFree( hCurProcess, 0, clrLineIntensImage );
Уууу как все запущено
Правило номер 1 явное освобождение ресурсов в С++ очень дурной тон ибо это прекрасно делает компилятор.
Если уж очень хочется через new
Здравствуйте, Orlena, Вы писали:
O>Какой ф-цией можно найти то место, в котором это происходит?
В отладочном режиме это делается с помощью dbgcrt. В частности:
* вставками _CtrCheckMemory — для локализации кусков кода, в котором происходит ошибка
* расставлением скобок _CrtMemCheckpoint для определения масштабов "трагедии"
Ну, и надо смотреть на симптомы. к примеру, у перезаписи динамического блока памяти симптомы — при освобождении памяти программа падает по Access Violation, т.к. перезаписанный кусок не может быть удален.
Если нет возможности поймать такое поведение в отладочной версии, то под виндой в релизе можно пользоваться BugslayerAPI от Роббинса.
Здравствуйте, Kaa, Вы писали:
Kaa>В отладочном режиме это делается с помощью dbgcrt. В частности: Kaa>* вставками _CtrCheckMemory — для локализации кусков кода, в котором происходит ошибка Kaa>* расставлением скобок _CrtMemCheckpoint для определения масштабов "трагедии"
Это очень похоже на то, что делает BoundChecker, он выдаёт memory leack и указывает на строчку в программке...
Спасибо за совет и сообщение
С уважением, Елена Орленко
Здравствуйте, Orlena, Вы писали:
O>Это очень похоже на то, что делает BoundChecker, он выдаёт memory leack и указывает на строчку в программке... O>Спасибо за совет и сообщение O>С уважением, Елена Орленко
Наверняка в этой строке происходит выделение памяти, которая потом не освобождается.
Быть может имеет смысл привести строку, на которую указывает BoundsChecker?
Здравствуйте, Bell, Вы писали: B>Наверняка в этой строке происходит выделение памяти, которая потом не освобождается. B>Быть может имеет смысл привести строку, на которую указывает BoundsChecker?
Ну ведь черным по белому написано, что память в этой строке выделяется, но не освобождается! Нужно вызывать HeapFree после использования памяти!
Или ты указатели где-то теряешь?
Здравствуйте, Orlena, Вы писали:
O>Здравствуйте, Bell, Вы писали: B>>Наверняка в этой строке происходит выделение памяти, которая потом не освобождается. B>>Быть может имеет смысл привести строку, на которую указывает BoundsChecker?
O>Вот на что: O>Memory leak O>1. pbiMemBmpImage = (PBITMAPINFO)HeapAlloc( hCurProcess, HEAP_ZERO_MEMORY, O> sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256 ); O>2. clrLineIntensImage = (COLORREF*)HeapAlloc( hCurProcess, O> HEAP_ZERO_MEMORY, sizeof(COLORREF)*iImageImgWidth + 5 ); O>и так далее
Это ты так долго понимать будешь что происходит.
Зайди в сеттинги BC. Выбери слева — custom.
Справа доложно быть выбранно — Memory error checking
Поставь все галочки справа.
Укажи размер guard'a в 32 (необязатльно, но желательно)
Выбери справа — Pointer and leak checking.
Поставь все галочки.
Теперь ты будешь иметь максимально жесткую проверку ситуаций — overrun/underrun, и стек вызовов при котором произошла утечка ресурсов/памяти.
HeapAlloc — это религия или, просто, по другому нельзя?
Re[6]: Строчки от BCh...
От:
Аноним
Дата:
26.11.03 17:06
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Orlena, Вы писали:
B>Ну ведь черным по белому написано, что память в этой строке выделяется, но не освобождается! Нужно вызывать HeapFree после использования памяти! B>Или ты указатели где-то теряешь?
мож и теряю... но free есть
Re[6]: Строчки от BCh...
От:
Аноним
Дата:
26.11.03 17:11
Оценка:
Здравствуйте, Alexey Chen, Вы писали:
AC>Теперь ты будешь иметь максимально жесткую проверку ситуаций — overrun/underrun, и стек вызовов при котором произошла утечка ресурсов/памяти.
AC>HeapAlloc — это религия или, просто, по другому нельзя?
Спасибо, настройки изменила... сейчас будем соображать дальше.
Да heap — не религия, просто так уж, пошло...