Переполнение памяти...
От: Orlena Россия  
Дата: 25.11.03 15:47
Оценка:
При программировании на С++ (win98) случилось переполнение памяти. Какой ф-цией можно найти то место, в котором это происходит?
Re: Переполнение памяти...
От: Bell Россия  
Дата: 25.11.03 15:56
Оценка:
Здравствуйте, Orlena, Вы писали:

O>При программировании на С++ (win98) случилось переполнение памяти. Какой ф-цией можно найти то место, в котором это происходит?


Эээ... Имеется ввиду переполнение стэка, или ошибка при динамическом выделении нового блока? Или что-то еще?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Переполнение памяти...
От: Orlena Россия  
Дата: 25.11.03 16:02
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Orlena, Вы писали:


O>>При программировании на С++ (win98) случилось переполнение памяти. Какой ф-цией можно найти то место, в котором это происходит?


B>Эээ... Имеется ввиду переполнение стэка, или ошибка при динамическом выделении нового блока? Или что-то еще?

В программе всего много... подозрение падает на динам.память
Re[3]: Переполнение памяти...
От: Bell Россия  
Дата: 25.11.03 16:15
Оценка:
Здравствуйте, Orlena, Вы писали:

O>В программе всего много... подозрение падает на динам.память


Чего это всего в ней много? И почему подозрение падает именно на динамическую память? Какие хоть симптомы?
Любите книгу — источник знаний (с) М.Горький
Re[4]: Переполнение памяти...
От: Orlena Россия  
Дата: 25.11.03 16:40
Оценка:
B>Чего это всего в ней много? И почему подозрение падает именно на динамическую память? Какие хоть симптомы?
Прошу прощения за долгий ответ... инет...
Использую BounChecker...
если долго не распространяться ,то он указывает на
x=new (...);
хотя есть у меня delete [] x;
а также используются ф-ции heaplock free... соответственно. Думала, что имеются некие ф-ции, позволяющие выдавать message, что мол память переполнена... я просто не могу отыскать в каком месте это происходит, может быть просто не в том месте удаляю выделенную память...
Надеюсь, что понятно...
Re[5]: Переполнение памяти...
От: Orlena Россия  
Дата: 25.11.03 16:45
Оценка:
ДА, если быть точнее ... такие ф-ции:

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? Форматируется винчестер?
Re[7]: Переполнение памяти...
От: Orlena Россия  
Дата: 25.11.03 17:20
Оценка:
А>Ыыыы... А Вы бы не могли описать, что именно происходит? new выкидывает bad_alloc? HeapAlloc возвращает NULL? Программа умирает по access violation? Форматируется винчестер?

Программа умирает в процессе работы и идёт restart, а иногда просто зависает комп и всё... Те ф-ции которые я привела в качестве примера — не единственные, на которые указывает BChecker...
Re[5]: Переполнение памяти...
От: jazzer Россия Skype: enerjazzer
Дата: 25.11.03 17:20
Оценка:
Здравствуйте, Orlena, Вы писали:

B>>Чего это всего в ней много? :) И почему подозрение падает именно на динамическую память? Какие хоть симптомы?

O>Прошу прощения за долгий ответ... инет...
O>Использую BounChecker...
O>если долго не распространяться ,то он указывает на
O>x=new (...);
O>хотя есть у меня delete [] x;
O>а также используются ф-ции heaplock free... соответственно. Думала, что имеются некие ф-ции, позволяющие выдавать message, что мол память переполнена... я просто не могу отыскать в каком месте это происходит, может быть просто не в том месте удаляю выделенную память...
O>Надеюсь, что понятно...

Может, у тебя new вызывается несколько раз, а delete — один?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Переполнение памяти...
От: Orlena Россия  
Дата: 25.11.03 17:21
Оценка:
НЕТ... всего поровну!
Re: Переполнение памяти...
От: Orlena Россия  
Дата: 25.11.03 17:29
Оценка:
Если у кого есть идеи решения проблемы, то присылайте по еmail, буду очень признательна. Просто сейчас выхожу из форума. Дела...
Re[6]: Переполнение памяти...
От: WolfHound  
Дата: 25.11.03 19:16
Оценка:
Здравствуйте, 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
boost::scoped_array<BYTE> z(new BYTE [iImageImgWidth*iImageImgHeight]);

или если через new не очень хочется(всеравно дефакто new не явно использован будет)
std::vector<BYTE> z(iImageImgWidth*iImageImgHeight);//память будет обнулена


И (к стати зачем тебе HeapAlloc нужен?)
//даже не компилировал
template<class T>
struct heap_buf
    :boost::noncopyable
{
    heap_buf(size_t count)
    {
        ptr_=(T*)HeapAlloc(hCurProcess, HEAP_ZERO_MEMORY, sizeof(T)*count)
    }
    ~heap_buf()
    {
        HeapFree(hCurProcess, 0, ptr_);
    }
    operator T*()
    {
        return ptr_;
    }
private:
    T* ptr_;
};

...

heap_buf<COLORREF> сlrLineIntensImage(iImageImgWidth);

Примерно так если будут вопросы спрашивай.

ЗЫ Судя по твоему кусочку кода могу с бОльшой вероятностью предположить что проблем у тебя в коде еще очень много.
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Переполнение памяти...
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 26.11.03 14:34
Оценка:
Здравствуйте, Orlena, Вы писали:

O>Какой ф-цией можно найти то место, в котором это происходит?

В отладочном режиме это делается с помощью dbgcrt. В частности:
* вставками _CtrCheckMemory — для локализации кусков кода, в котором происходит ошибка
* расставлением скобок _CrtMemCheckpoint для определения масштабов "трагедии"

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

Если нет возможности поймать такое поведение в отладочной версии, то под виндой в релизе можно пользоваться BugslayerAPI от Роббинса.

Пример фильтра здесь
Автор: Kaa
Дата: 14.03.02
.
Сам мегатул здесь
Алексей Кирдин
Re[2]: Похоже на Boundchecker...
От: Orlena Россия  
Дата: 26.11.03 15:02
Оценка:
Здравствуйте, Kaa, Вы писали:

Kaa>В отладочном режиме это делается с помощью dbgcrt. В частности:

Kaa>* вставками _CtrCheckMemory — для локализации кусков кода, в котором происходит ошибка
Kaa>* расставлением скобок _CrtMemCheckpoint для определения масштабов "трагедии"

Это очень похоже на то, что делает BoundChecker, он выдаёт memory leack и указывает на строчку в программке...
Спасибо за совет и сообщение
С уважением, Елена Орленко
Re[3]: Похоже на Boundchecker...
От: Bell Россия  
Дата: 26.11.03 15:14
Оценка:
Здравствуйте, Orlena, Вы писали:

O>Это очень похоже на то, что делает BoundChecker, он выдаёт memory leack и указывает на строчку в программке...

O>Спасибо за совет и сообщение
O>С уважением, Елена Орленко

Наверняка в этой строке происходит выделение памяти, которая потом не освобождается.
Быть может имеет смысл привести строку, на которую указывает BoundsChecker?
Любите книгу — источник знаний (с) М.Горький
Re[4]: Строчки от BCh...
От: Orlena Россия  
Дата: 26.11.03 15:42
Оценка:
Здравствуйте, Bell, Вы писали:
B>Наверняка в этой строке происходит выделение памяти, которая потом не освобождается.
B>Быть может имеет смысл привести строку, на которую указывает BoundsChecker?

Вот на что:
Memory leak
1. pbiMemBmpImage = (PBITMAPINFO)HeapAlloc( hCurProcess, HEAP_ZERO_MEMORY,
sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256 );
2. clrLineIntensImage = (COLORREF*)HeapAlloc( hCurProcess,
HEAP_ZERO_MEMORY, sizeof(COLORREF)*iImageImgWidth + 5 );
Recourse leak
1. Pattern1 = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_BITMAP1 ) );
2. BkgrndBrush = CreatePatternBrush( Pattern1 );
3. hMemDCImage = CreateCompatibleDC( hDCImage );
4. hMemDCSectionx = CreateCompatibleDC( hDCImage );
5. hMemDCSectiony = CreateCompatibleDC( hDCImage );
6. hMemBmpImage = CreateCompatibleBitmap( hDCImage, iImageImgWidth, iImageImgHeight );
7. hMemBmpSectionx = CreateCompatibleBitmap( hDCImage, iImageImgWidth, iSectionHeight );
8. hMemBmpSectiony = CreateCompatibleBitmap( hDCImage, iSectionHeight, iImageImgHeight );
9. WhiteBrush = CreateSolidBrush( RGB( 255, 255, 255 ) );
10. BlackBrush = CreateSolidBrush( RGB( 0, 0, 0 ) );

и так далее
Re[5]: Строчки от BCh...
От: Bell Россия  
Дата: 26.11.03 16:18
Оценка:
Здравствуйте, Orlena, Вы писали:

Ну ведь черным по белому написано, что память в этой строке выделяется, но не освобождается! Нужно вызывать HeapFree после использования памяти!
Или ты указатели где-то теряешь?
Любите книгу — источник знаний (с) М.Горький
Re[5]: Строчки от BCh...
От: Alexey Chen Чили  
Дата: 26.11.03 16:21
Оценка:
Здравствуйте, 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 — не религия, просто так уж, пошло...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.