Выделение и освобождение оперативной памяти

Управление памятью производится при помощи операторов new и delete, а так же функциями  malloc и free (объявлены в stdlib.h).

  • new используется для выделения памяти, в случае если выделение не произошло, возвращается нулевой указатель.
  • delete служит для освобождения памяти. После освобождения памяти указателю необходимо присвоить значение 0, чтобы избежать дальнейших ошибок.
Оператор new можно перегрузить для новых классов, а оператор delete для классов автоматически вызывает деструктор.

Как альтернативой можно воспользоваться С функциями как malloc и free. Эти функции нельзя смешивать с операторами динамической памяти, то есть нельзя выделить память оператором new и освободить ее функцией free или наоборот.

Пример кода с операторами new и delete:

#include <iostream>

using namespace std;

int main()
 {
        // создание объекта типа int со значением 7
        // и сохранение его адреса в указателе a
        int *a = new int (7); 
        // освободили память на которую указывал a
        cout << *a << endl;
        delete a; 
        // элементы массива нельзя инициализировать
        // им задается значение по умолчанию
        // в случае классов вызывается конструктор по умолчанию
        int *mas = new int [10];
        for (int i = 0; i < 10; i++)
        cout << mas[i] << " ";
        cout << endl;
        delete [] mas;
        // при доступе  к нулевому указателю 
        // генерируется системная ошибка,
        // а значит ошибка не останется незамеченной
        mas = 0
        return 0;
}
Пример использования функции malloc и free:

#include <stdafx.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main()
{
    int i, n;
    float *a; 
    float s;
    cout << endl;
    //ввод размерности массива
    cin >> n; 
    //выделение памяти под массив из n вещественных элементов

    (float *)malloc(n*sizeof(float));
    cout << endl;
    //ввод элементов массива
    for (0; i n; i++)
    {
        cin >> *(a+i);
    }
    //накапливание суммы элементов массива
    for (0, i 0; i n; i++)
    +*(a+i);
    //вывод значения суммы
    cout << << endl;
    //освобождение памяти
    free (a);
    return 0;
}
}
Comments