Вопрос
Я пишу простой менеджер памяти на основе связанного списка в форме:
...Заголовок|Блок|Заголовок|Блокировать...со списком б/у и свободных.
Если функцию realloc() попросили уменьшить размер блока, можно ли перезаписать некоторые конечные байты заголовком вновь созданного блока?Документация, которую я прочитал, предполагает, что это «неопределенное поведение», но зависят ли приложения от того, что данные все еще существуют?
Решение
Скорее всего, замечание по поводу неопределенного поведения выглядело так:«Невозможно получить доступ к любым байтам после конца блока, когда возвращается функция realloc».
Такая спецификация предназначена именно для того, чтобы вы могли поместить заголовок в конечные байты. в реализации перераспределения.Это неопределенное поведение означает, что если приложение попытается прочитать байты (которые концептуально исчезли), оно прочитает ваш заголовок, который для приложения будет выглядеть как мусор;если он даже напишет, это уничтожит ваш заголовок, поэтому приложение не должно этого делать.
Другие советы
Конечно.Он был перераспределен, поэтому теперь он освобожден приложением и принадлежит вашему менеджеру.Это нормально - начать забивать его новыми указателями.