C/C++

Зачем освобождать память?

Память, динамически выделенная с использованием функций calloc(), malloc(), может быть освобождена с использованием функции

free(указатель);

Я так понял, что программа сама по себе может это сделать.. и получается - это лишь считается «Правилом хорошего тона».

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

#include <stdlib.h>
#include <stdio.h>
double* fn_a(size_t n) {
double* ptr = malloc(n * sizeof(double));
return ptr;
}
double* fn_b(size_t n) {
double* ptr = malloc(n * sizeof(double));
free(ptr);
return ptr;
}
int main(void) {
size_t n = 0x100000;
int m = 0x2000;
int i;
for (i = 0; i < m; ++i) if (!fn_b(n)) break;
printf("With the free() function: i = 0x%X\n", i);
for (i = 0; i < m; ++i) if (!fn_a(n)) break;
printf("Without free() function: i = 0x%X\n", i);
system("pause > nul");
return 0;
}
Дима Анисимов
Дима Анисимов
79 739
Лучший ответ
>Я так понял, что программа сама по себе может это сделать..
Ты что-то неправильно понял, сама по себе память не освободится до самого окончания главного процесса программы. А после этого программа с ее освобождением уже ничего общего иметь не будет.
Память - очень "дорогой" ресурс совместного пользования, занимать его дольше, чем нужно - не просто плохой тон, за такое коллеги могут и морду набить.
ВД
Ваня Дернов
80 248
Если выделять память и не освобождать её - это приведёт к утечкам памяти. В результате потребление памяти программой будет расти, пока память не закончится, или пользователь не прибьёт программу. Для кратковременных программ (которые что-то делают и закрываются) это не критично, но если программа рассчитана на долговременную работу - то это очень плохо
Назаров Сергей
Назаров Сергей
81 486
"Память, динамически выделенная с использованием функций calloc(), malloc()"

И еще new, если C++.

"Я так понял, что программа сама по себе может это сделать"

Нет, программа это сделает сама только когда завершится. Если программа будет работать длительное время, и в ней не будет очисток, то она успеет засрать все ОЗУ компа.
Поэтому если память выделяешь вручную - надо чистить.
Но по возможности лучше вообще не выделять ее вручную. В C++ особенно.

"это лишь считается «Правилом хорошего тона»."

Все правила хорошего тона имеют логическое объяснение. Хотя бывают случаи, когда каким-то из них можно пренебречь и это прокатит. Но - не всегда.
AB
Ayan Bedelbaev
92 464
Программа сама НЕ МОЖЕТ ничего сделать. Просто система принимает от программы участок памяти для хранения данных. И если его вовремя не освободить также принудительно, система продолжит его резервировать и тем самым не давать его использовать другим программам. В с++ деструктор очищает как раз память по ссылку на выделенную динамически память под какой-нибудь объект. Но это забота программиста и кажется, что программа сама очищает