// не умещается на стек
double m[100000000] = {}; // 80 Mb
// => segmentation fault or access violation error
Стандартная библиотека cstdlib
предоставляет четыре функции для управления памятью:
void * malloc (size_t size);
void free (void * ptr);
void * calloc (size_t nmemb, size_t size);
void * realloc (void * ptr, size_t size);
size_t
- специальный целочисленный беззнаковый тип, может вместить в себя размер любого типа в байтах. ( int
‘a не всегда достаточо)size_t
используется для указания размеров типов данных, для индексации массивов и пр.void *
- это указатель на нетипизированную память (раньше для этого использовалось char *
)malloc
- выделяет область памяти размера >= size
. Не кратный размер памяти выделяется по следующим причинам
calloc
- выделяет массив из nmemb
размера size
. Данные инициализируются нулём.realloc
- изменяет размер области памяти по указателю ptr
на size
(если возможно, то это делается на месте).free
- освобождает облать памяти, ранее выделенную одной из функций malloc/calloc/realloc
.sizeof
.
// create an array of 1000 int
int * m = (int *)malloc(1000 * sizeof(int));
m[10] = 10;
// change array size to 2000
m = (int *)realloc(m, 2000 * sizeof(int));
// free memory
free (m);
// create an array of int and inicialize it with 0
m = (int *)calloc(3000, sizeof(int));
free(m);
m = 0; // best practise
new
и delete
- для одиночных значений,new[]
и delete[]
- для массивов.delete
должна соответствовать версии оператора new
.
// выделение памяти под один int со значением 5
int * m = new int(5);
delete m; // освобождение памяти
// создание массива нулей
m = new int[1000];
delete [] m; // освобождение памяти
int * m = new int[1000];
m = new int[2000]; // потеряли указатель но массив из 1000 элементов => утечка памяти
// не вызван delete [] m => утечка памяти
int * m1 = new int[1000];
delete m1; // должно быть delete [] m1;
int *p = new int(0);
free(p); // совмещение функций С++ и С
int *q1 = (int*) malloc (sizeof(int));
free(q1);
free(q1); // двойное удаление
int *q2 = (int*) malloc(sizeof(int));
free(q2);
q2 = 0;
free(q2); // правильно работает для q2 = 0;