Дано:
void foo(void) {
char buffer[100];
}
время жизни объекта buffer
начинается, когда выполнение достигает открытия {
(при входе в функцию), и заканчивается, когда выполнение покидаетблок, достигнув закрытия }
(или с помощью других средств, таких как оператор goto
, break
или return
).
Нет никакого способа закончить время жизни buffer
, кромеоставив блок.Если вы хотите иметь возможность освободить его, вы должны распределить его другим способом.Например, если вы выделяете объект, вызывая malloc()
, вы можете (и в значительной степени обязаны) освободить его, вызвав free
:
void foo(void) {
char *buffer_ptr = malloc(100);
if (buffer_ptr == NULL) /* error handling code here */
/* ... */
if (we_no_longer_need_the_buffer) {
free(buffer_ptr);
}
/* now buffer_ptr is a dangling pointer */
}
Альтернативой является ограничение времени жизни buffer
определяя его во вложенном блоке:
void foo(void) {
/* ... */
{
char buffer[100];
/* ... */
}
/* buffer's lifetime has ended */
}
Но только потому, что время жизни buffer
заканчивается, когда управление покидает внутренний блок, это не гарантирует его физического освобождения.В абстрактной машине buffer
больше не существует после выхода из внутреннего блока, но сгенерированный код может оставить его в стеке только потому, что это более удобно.
Если вы хотите контролировать распределение и освобождение, вам нужноиспользовать malloc
и free
.