Вопрос
Я знаю, что это действительно общее, но я получаю «это» (см. Ниже), когда я запускаю свой файл .c в Visual C ++ 2008 Express. Это происходит, когда я звоню malloc ()
. Анкет Возьмите мою работу по этому поводу - я динамически распределяю память должным образом.
Heap [code.exe]: Heap: бесплатный блок Heap 211A10, измененный при 211AF8 после того, как Freed Windows запустила точку останова в code.exe.
Это может быть связано с повреждением кучи, которая указывает на ошибку в code.exe или любом из загруженных DLL.
Это также может быть связано с тем, что пользователь нажимает F12, в то время как Code.exe фокусируется.
Выходное окно может иметь больше диагностической информации.
Почему я получу эту ошибку? Что это вообще значит?
Решение
Сообщение об ошибке говорит вам именно, почему вы его получили:
Бесплатный блок кучи 211A10 модифицирован при 211AF8 после его освобождения
У вас была куча выделенного блока, который был освобожден, затем что -то написало в эту область памяти. Нехорошо написать в освобожденный блок памяти.
Другие советы
Ошибка на самом деле не Происходит Когда вы называете Malloc; Именно тогда это запускает бесплатное сканирование кучи. Фактическая ошибка произошла где -то раньше. Вы сделали немного памяти по адресу 211A10 (это то, что Malloc вернул вам). Тогда вы (или какой -то другой либерал) освободили его. Позже, когда вы звоните Malloc в режиме отладки, он сканирует всю кучу - как вам вежливость, бедный программист. Он обнаруживает, что кто -то (ваша или какая -то LIB, которую вы называете) записал часть этого массива, в частности по адресу 211AF8, или 0xE8 байтов в массив. Таким образом, вы либо все еще висели на указатель, который был освобожден (скорее всего), и используете его, либо просто разбиваете случайную память.
В моем случае, с аналогичными симптомами, проблема заключалась в несоответствию выравнивания структуры (вариант/ZP)
Я определил для своего кода другим выравниванием структуры, чем внешние библиотеки (WXWIDGETS). Тем не менее, WXWIDGETS был построен с помощью MakeFile, поэтому он был составлен с использованием DeFaut /ZP. И wxwidget статически связан.
Вы можете сделать это, но если вы попытаетесь удалить объект класса WXWIDGETS из вашего кода Компилятор смущается точным размером элементов struct. И при запуске вы получаете это сообщение:
HEAP[Code.exe]: HEAP: Free Heap block 211a10 modified at 211af8 after it was freed
Windows has triggered a breakpoint in Code.exe.
Решение:
Обязательно используйте одно и то же «выравнивание членов struct» во всех кодах и библиотеках.
Лучшее правило - определить /ZP для использования значения «по умолчанию». В Visual Studio, в рамках свойств C/C ++ Generation
MSDN цитирует: "Вы не должны использовать эту опцию, если у вас нет конкретных требований к выравниванию." Глянь сюда
Совет: используйте #Pragma Pack Если вам нужно контролировать выравнивание в некоторых структурахУвидеть там
Пример:
#pragma pack(1) // - 1 byte alignment
typedef union
{
u64 i;
struct{ // CUSTOMS.s is used by Folders
u32 uidx; // Id, as registered
byte isoS, isoT; // isoS/isoT combination.
byte udd0, udd1; // custom values (TBD)
}s;
}CUSTOMS;
struct Header // exactly 128 bits
{
u32 version;
u32 stamp; // creation time
CUSTOMS customs; // properties
}
#pragma pack() // this pragma restores the **default** alignment
*
Надеюсь, это объяснение поможет, потому что это на самом деле не ошибка в коде, а серьезная ошибка конфигурации: трудно обнаружить, потому что оно находится в тонких вариантах компилятора. Спасибо за все,
-
*
Я динамически распределяю память должным образом.
Я думаю, что проблема здесь в том, что вы не расщепляете память. Я имею в виду, что это то, что вы можете использовать освобожденную память. Извините, я не могу помочь дальше, вы, вероятно, могли бы добавить фактический код.
Возьмите мою работу по этому поводу - я динамически распределяю память должным образом.
Но вы уверены, что ваши буферы - все правильный размер, и вы free()
их правильно? Двойные свободы и переполнения буфера могут легко привести к коррупции кучи, которая может вызвать malloc()
потерпеть неудачу всеми способами.
Если структуры управления, используемые внутри malloc()
Повторно, это обычно не приведет к ошибке сразу. Но позже звонит malloc()
или же free()
что попытка использовать эти поврежденные структуры потерпит неудачу, делая неустойчивые вещи.
Вы используете Malloc () в массиве? Потому что я считать Ошибка может быть просто, вы забыли выделить Дополнительное местоположение памяти в конце - Что происходит, так это то, что он пытается написать в это место, которое не выделяется ему, и предполагает, что он пытается написать в место, которое уже было освобождено.