// не умещается на стек
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;