Вопрос

int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

Почему коррупция кучи происходит в free (b);?

ИМО, коррупция кучи уже происходит в *b=110000;.

Это было полезно?

Решение

malloc()Аргумент - это количество байтов для распределения. Вам нужно использовать:

b = (int*) malloc(sizeof(int));

Вы выделили слишком маленький блок, а затем написали на него больше байтов, чем вы выделили, что перезаписывает информацию о бухгалтерском учете рядом с блоком, развращая кучу.

Другие советы

Это в *b = 110000; Потому что вы выделяете память для одного байта, а затем присваиваете INT в нее, которая составляет более одного байта. Либо вы можете иметь b = (int *) malloc (sizeof (int)), либо вместо int *b у вас может быть char *b, а затем бросить указатель с мазором на char *. Код может даже работать, если вы назначите значение, которое составляет менее 128 (из -за подписанного char) *b.

РЕДАКТИРОВАТЬ:- Я думаю, что иногда даже это будет работать без каких-либо хлопот. Потому что компилятор может выбрать выделение более одного байта памяти для быстрого доступа данных.

Коррупция кучи действительно случается уже в *b=11000 назначение, но оно не обнаруживается до free(b) Позвоните, потому что это первый момент, когда целостность кучи снова проверяется.

Проверка целостности кучи при каждом задании (или даже каждом назначении, связанном с указателем, привязанными к остановке), будет замедлить большинство программ слишком сильно, и это будет слишком тесно связать компилятор с реализацией библиотеки. По этой причине проверки целостности выполняются только при манипулировании кучи, которая находится в malloc и free функции (и друзья).

Код записывает больше данных в блок памяти, чем пространство, доступное для него, следовательно, повреждая начало следующего достоверного блока памяти.

Использование char *, а не int * и написание значения -128 до 127 к * B должно это исправить.

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