Подтвердить что ты не робот

Как "free" работает, когда указатель увеличивается

Когда вызывается malloc, размер сохраняется рядом с выделенным блоком, так что бесплатный будет знать, сколько бесплатно и т.д. (http://c-faq.com/malloc/freesize.html).

Мой вопрос: скажем, у нас есть динамически распределенная память, а позже в коде мы увеличиваем указатель

 pointer++

И потом, если я назову

free(pointer) 

какая память действительно освобождается.

Это количество выделенных байтов, начиная с текущего адреса, указанного указателем или от базового адреса, на который он был выделен.

4b9b3361

Ответ 1

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

Подумайте о указателе, который вы получаете как книгу из библиотеки. Вы возвращаетесь домой и читаете его. Затем вы удаляете переднюю страницу и книгу обратно и передаете ее библиотекарю. Принят ли он это или у вас серьезные проблемы сейчас?;-)

Ответ 2

Вы можете вызвать только free() по значению, которое вы ранее получили от malloc(), calloc() или realloc() (или NULL). Все остальное undefined.

Например, реализация может сохранить размер выделенного блока в 4 байта перед обратным адресом из malloc(). Затем free() возвращает 4 байта и узнает размер. Это не сработает, если вы не передадите исходный указатель обратно на free().

Ответ 3

Это приведет к поведению undefined. Скорее всего, это приведет к сбою вашей программы мгновенно или позже.

Ответ 4

Это поведение undefined. Вероятно, это, скорее всего, приведет к проблеме.

Ответ 5

Если вы увеличиваете указатель, не сохраняя исходное место в malloced, вы не можете позвонить на него. Вы должны сохранить исходное местоположение где-нибудь и использовать временную точку, когда вы увеличиваете.

Ответ 6

Это то, что мы называем недостатком утечки памяти/сегментации.

Вам нужно передать тот же самый указатель на free(), что и тот, который вы получили из malloc(), или ваше приложение будет ошибочно/сбой.

Ответ 7

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

Ответ 8

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

Это называется поведением undefined, и это означает что-то среднее. Он может отформатировать ваш жесткий диск, поджечь ваш процессор или сделать вашу программу, похоже, работать так, как ожидается, пока вы не уйдете на пенсию. Никогда не знаешь.

Ответ 9

Указатель, возвращаемый malloc(), указывает непосредственно на память в куче, которая будет использоваться вашей программой.

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

Когда вызывается free (p), информация о его куске в куче содержится, например, в местах с p-4 до p-1. Это зависит от реализации курса, но детали не должны касаться программиста. Единственное, что программист должен знать, это то, что free использует эту область памяти, чтобы освободить кусок памяти из кучи, и эта область получена из исходного указателя p.

Другими словами, если вы вызываете free на p, это будет иметь смысл, только если malloc вернул ровно p.

Если вы передадите указатель, который не был создан с помощью malloc, кто знает, что будет с p-1, p-2 и т.д.? Вероятно, это приведет к катастрофическому сбою.