Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Непонятное исключение в dbgheap.c


Автор: shedon 17.3.2004, 20:32
у меня есть функция которая выглядит так
Код

BOOL CCheckingDlg::SaveData()
{
CFile fFile;
DWORD dw = 1500;
//char sData[20480];
//memset(sData, 0, strlen(sData));
CString sCode = _T("");
try{
// Загружаем заголовок и строку с именем прибора
fFile.Open("Head.dat", CFile::modeRead);
fFile.Read(sCode.GetBuffer(), fFile.GetLength());
file.Write(sCode.GetBuffer(), sCode.GetLength());
file.Write(m_sDevCheckName.GetBuffer(), m_sDevCheckName.GetLength());
fFile.Close();
}
catch(CFileException *pEx)
{
 pEx->ReportError();
 pEx->Delete();
}

return TRUE;
}

file является объектом CStdioFile.
всё функция проходит нормально, всё читается, всё записывается, но сразу после выхода из функции возникает эксцепшон
Цитата
Unhandled exception at 0x77fa144b (NTDLL.DLL) in EtalonFM.exe: User breakpoint.

указывает на файл dbgheap.c
Код

#else  /* WINHEAP */

       /*
        * Go through the heap regions and see if the pointer lies within one
        * of the regions of the local heap.
        *
        * Pointers from non-local heaps cannot be handled. For example, a
        * non-local pointer may come from a DLL that has the CRT linked-in.
        *
        */

       for (i = 0; (base = _heap_regions[i]._regbase) != NULL &&
               i < _HEAP_REGIONMAX; i++)
       {
           if (pUserData >= base && pUserData <
                   (void *)(((char *)base)+_heap_regions[i]._currsize))
               return TRUE;
       }

       return FALSE;

#endif  /* WINHEAP */
} // ЭКСЦЕПШЕН УКАЗЫВАЕТ СЮДА !!!!

да, забыл компилю под VC7.0 smile.gif

Автор: Гость_сергей 18.3.2004, 15:37
sad.gif ломаешь
выходишь где то за регион

Автор: shedon 18.3.2004, 15:46
за какой регион ? в sCode слишком большое значение ?

Автор: sergejzr 18.3.2004, 16:08
А что дибагер говорит?
Такого рода ошибки происходят, когда деструктируются обьекты, заложенные в функции.
посмотри fFile, sCode
возможно я не прав

Автор: srd 18.3.2004, 16:13
Проблема в неправильном использовании объекта класса CString. Во первых, ты копируешь что-то в строку, не выделив перед этим память. Длину буфера можно указать в параметре функции-члена GetBuffer. Во вторых, после использования полученного буфера необходимо вызвать функцию-член ReleaseBuffer() до любого другого использования строки. Т.е.
Код

CString s;
char *buffer = s.GetBuffer(11);
lstrcpy(buffer, "0123456789");
s.ReleaseBuffer(); // после этой строки buffer указывает уже не известно на что

Поэтому и получается, что ломается куча.

Автор: shedon 18.3.2004, 16:15
а что он должен говорить ? функция проходит нормально, а после выхода эксцепшон, типа инструкция такая-то обратилась к такой-то памяти
Добавлено @ 16:18
srd,
посмотрю, спасибо

Автор: shedon 19.3.2004, 08:18
srd, спасибо, всё зароботало

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)