Я разрабатываю диалоговую программу на Visual Studio 2012.
И у меня в отладчике выскакивает сообщение:
Debug Assertion Failed!
Program: F:\Roman\Roman\MyProgram\MyProgram\Debug\MyProgram.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Line: 1332
Expression: _CrtIsValidHeapPointer(pUserData)
Что это означает? Как исправить эту ошибку?
1613 г. = 2024 г.
Здравствуйте, RussianFellow, Вы писали:
RF>Я разрабатываю диалоговую программу на Visual Studio 2012.
RF>И у меня в отладчике выскакивает сообщение:
Это не отладчик выдает ошибку. Это программа выдает ошибку, а отладчит умеет ее показывать.
RF>RF>File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Слово heap в названии файла как-бы намекает, что речь идет об выделении/освобождении памяти.
RF>RF>Expression: _CrtIsValidHeapPointer(pUserData)
Слова IsValidHeapPointer как бы намекают о том, что речь идет о проверке валидности (IsValid) указателя (Pointer) на некий объект в куче (Heap). А слова UserData как бы намекают о том, что указатель был получен от "пользователя" (User). А поскольку речь идет о C run-time library (CRT), то ее пользователем является программа, которая ее использует.
Складывая все вместе, мы можем предположить, что библиотеке был передан невалидный указатель. Поскольку в контексте выделения/освобождения памяти указатель библиотеке передается обычно с целью освобождения, и изредка с целью перевыделения (realloc), то идем в исходники своей программы и пытаемся понять, с чего бы она попыталась освободить нечто, что библиотека не считает валидным (т.е., ранее выделенным) объектом.
Обычно такое бывает, когда кусок памяти освобождают дважды, либо пытаются освободить то, чего раньше не брали (например, указатель на статический объект, на объект на стеке, или на середину вполне валидного объекта, или вообще в указателе содержится мусор, т.е., мы забыли положить в него осмысленное значение).
1613 г. = 2024 г.