Память, динамически выделенная с использованием функций calloc(), malloc(), может быть освобождена с использованием функции
free(указатель);
Я так понял, что программа сама по себе может это сделать.. и получается - это лишь считается «Правилом хорошего тона».
Вот только я не пойму, каков смысл в этом процессе и чем это может помочь мне в дальнейшем при написании программ?
C/C++
Зачем освобождать память?
Попробуйте проанализировать выполнение следующего кода с открытым монитором памяти в диспетчере задач и вы увидите различие. Время выполнения будет зависеть от производительности вашей системы.
#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;
}
#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;
}
>Я так понял, что программа сама по себе может это сделать..
Ты что-то неправильно понял, сама по себе память не освободится до самого окончания главного процесса программы. А после этого программа с ее освобождением уже ничего общего иметь не будет.
Память - очень "дорогой" ресурс совместного пользования, занимать его дольше, чем нужно - не просто плохой тон, за такое коллеги могут и морду набить.
Ты что-то неправильно понял, сама по себе память не освободится до самого окончания главного процесса программы. А после этого программа с ее освобождением уже ничего общего иметь не будет.
Память - очень "дорогой" ресурс совместного пользования, занимать его дольше, чем нужно - не просто плохой тон, за такое коллеги могут и морду набить.
Если выделять память и не освобождать её - это приведёт к утечкам памяти. В результате потребление памяти программой будет расти, пока память не закончится, или пользователь не прибьёт программу. Для кратковременных программ (которые что-то делают и закрываются) это не критично, но если программа рассчитана на долговременную работу - то это очень плохо
"Память, динамически выделенная с использованием функций calloc(), malloc()"
И еще new, если C++.
"Я так понял, что программа сама по себе может это сделать"
Нет, программа это сделает сама только когда завершится. Если программа будет работать длительное время, и в ней не будет очисток, то она успеет засрать все ОЗУ компа.
Поэтому если память выделяешь вручную - надо чистить.
Но по возможности лучше вообще не выделять ее вручную. В C++ особенно.
"это лишь считается «Правилом хорошего тона»."
Все правила хорошего тона имеют логическое объяснение. Хотя бывают случаи, когда каким-то из них можно пренебречь и это прокатит. Но - не всегда.
И еще new, если C++.
"Я так понял, что программа сама по себе может это сделать"
Нет, программа это сделает сама только когда завершится. Если программа будет работать длительное время, и в ней не будет очисток, то она успеет засрать все ОЗУ компа.
Поэтому если память выделяешь вручную - надо чистить.
Но по возможности лучше вообще не выделять ее вручную. В C++ особенно.
"это лишь считается «Правилом хорошего тона»."
Все правила хорошего тона имеют логическое объяснение. Хотя бывают случаи, когда каким-то из них можно пренебречь и это прокатит. Но - не всегда.
Программа сама НЕ МОЖЕТ ничего сделать. Просто система принимает от программы участок памяти для хранения данных. И если его вовремя не освободить также принудительно, система продолжит его резервировать и тем самым не давать его использовать другим программам. В с++ деструктор очищает как раз память по ссылку на выделенную динамически память под какой-нибудь объект. Но это забота программиста и кажется, что программа сама очищает
Похожие вопросы
- C++ и динамическая память: это приемлемо?
- Если приложение вызывает утечку памяти, то при завершение работы приложения динамическая память очиститься или нет?
- Устройство статических и динамических массивов в оперативной памяти (...)
- Программирование, динамическое выделение памяти в конструкторе класса
- Как компьютер определяет что в памяти записано знаковое или беззнаковое число?
- Leetcode. Обнулить строки и столбцы матрицы с константным потреблением памяти.
- Не правильное значение по адресу памяти c++
- Почему нельзя освободить выделенную память для элемента массива или как это сделать правильно?
- Как взять значение конкретного адреса в памяти?
- Для знающих: как рассчитали максимум видимости оперативной памяти для 32- и 64-разрядных систем? На примере Windows.