Что происходит с локальной переменной-указателем внутри функции, которая была динамически размещена? - PullRequest
2 голосов
/ 23 октября 2019

Мне любопытно узнать, что произойдет, если вы объявите указатель int внутри функции, а затем динамически выделите его, используя malloc

void testing(){
   int *p = malloc(sizeof(int));
   *p = 5;
}

Живут ли данные (в данном случае 5) вкуча, даже если указатель уничтожается после завершения выполнения функции?

Ответы [ 3 ]

2 голосов
/ 23 октября 2019

Живут ли данные (в данном случае 5) в куче, даже если указатель уничтожен?

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

1 голос
/ 23 октября 2019

Память, выделенная с помощью malloc() или calloc(), не освобождается автоматически. Вы должны вызвать free() явно, чтобы освободить память.

// Allocate
int* p = (int*)malloc(10 * sizeof(int)); 

// De-allocate
free(p);
0 голосов
/ 23 октября 2019

В этой функции

void testing(){
   int *p = malloc(sizeof(int));
   *p = 5;
}

локальная переменная (указатель) p имеет продолжительность автоматического хранения.

Для такого объекта, у которого нет типа массива переменной длины, его время жизни простирается от входа в блок, с которым он связан, до тех пор, пока выполнение этого блока каким-либо образом не закончится (стандарт C)).

Объект, который занимает выделенную память с помощью malloc, имеет выделенную продолжительность памяти.

Время жизни выделенного объекта распространяется от выделения до освобождения. (Стандарт C).

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

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