Вопрос

Я знаю, что это действительно общее, но я получаю «это» (см. Ниже), когда я запускаю свой файл .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 () в массиве? Потому что я считать Ошибка может быть просто, вы забыли выделить Дополнительное местоположение памяти в конце - Что происходит, так это то, что он пытается написать в это место, которое не выделяется ему, и предполагает, что он пытается написать в место, которое уже было освобождено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top