Выделение и освобождение памяти - PullRequest
4 голосов
/ 22 марта 2011

Мой вопрос довольно прост. Обычно мы выделяем память, объявляя указатель, а затем назначая блок памяти этому указателю. Предположим, где-то в коде я использую

ptr = ptr + 1

и затем я использую

free(ptr)

Может кто-нибудь сказать, что будет. Весь блок памяти будет освобожден или что-то еще. Можно ли частично освободить память?

Ответы [ 4 ]

7 голосов
/ 22 марта 2011

Вы должны всегда передавать точно тот же самый указатель на free, который вы получили от malloc (или realloc.) Если вы этого не сделаете, "поведение не определено", чтотермин искусства, который означает, что вы не можете полагаться на программу, которая ведет себя каким-либо предсказуемым образом.В этом случае, однако, вы должны ожидать, что он сразу же потерпит крах.(Если вам не повезет, вместо этого он испортит память, что вызовет сбой через некоторое время или, что еще хуже, приведет к неправильному выводу.)

Единственный способ частично освободить память - это realloc с меньшим размером, но этоподходит только для обрезки в конце и не гарантирует, что обрезанный кусок будет доступен для какого-то другого выделения.

1 голос
/ 22 марта 2011

malloc (), free () и realloc () не являются частью языка C.

Это определения функций в стандартной библиотеке.Код в стандартной библиотеке, с которой он работает, обычно называется «распределителем».Итак, фактический ответ: «Это зависит от библиотеки C».

В Linux glibc может вызвать сбой программы.На VC ++ среда выполнения C может повредить состояние распределителя

Исходный код доступен для этих библиотек, так что вы можете фактически поставить точку останова и перейти в свободную.

1 голос
/ 22 марта 2011

Вы должны передать free () тот же указатель на то же местоположение, что и malloc (). Это потому, что распределитель хранит своего рода список выделенных блоков (@everyone: не стесняйтесь добавлять / изменять, если я ошибаюсь), и если указатель, который вы передаете free, не сравнивает его, этот список free () жалуется ( "плохой блок памяти" может быть?). Чтобы частично освободить память, вы должны использовать realloc (), которая изменяет размеры этого блока памяти, но работает медленно и неэффективно. Вы должны использовать его, только когда вы уверены в новом размере блока или оставляете больше места для заполнения в будущем.

1 голос
/ 22 марта 2011

Невозможно освободить часть блока памяти. Единственное, что вы можете сделать, это перераспределить блок, придав ему другой размер. Однако это не гарантирует, что блок окажется в том же месте в памяти (он может быть скопирован в другое место).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...