Выделение памяти в куче в C++ позволяет динамически управлять памятью во время выполнения программы. В отличие от стека, где память выделяется и освобождается автоматически, в куче программист управляет памятью вручную. Это дает большую гибкость, но требует внимательности, чтобы избежать утечек памяти и других ошибок.

Основные операции

В C++ для работы с кучей используются операторы new и delete.

Выделение памяти с помощью new

Оператор new выделяет память в куче и возвращает указатель на выделенную область памяти. Пример выделения памяти для одного объекта:

int* p = new int; // выделение памяти для одного целого числа
*p = 10; // присваивание значения
 
double* d = new double(5.5); // выделение и инициализация памяти для одного числа с плавающей точкой

Для выделения памяти для массива используется следующая форма new:

int* arr = new int[10]; // выделение памяти для массива из 10 целых чисел

Освобождение памяти с помощью delete

Оператор delete освобождает память, выделенную с помощью new. Для одного объекта используется обычная форма delete:

delete p; // освобождение памяти для одного целого числа
delete d; // освобождение памяти для одного числа с плавающей точкой

Для массива необходимо использовать форму delete[]:

delete[] arr; // освобождение памяти для массива из 10 целых чисел

Примеры использования

Пример выделения и освобождения памяти для одного объекта:

#include <iostream>
 
int main() {
    int* p = new int; // выделение памяти
    *p = 42; // использование памяти
    std::cout << "Value: " << *p << std::endl;
    delete p; // освобождение памяти
 
    return 0;
}

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

#include <iostream>
 
int main() {
    int* arr = new int[5]; // выделение памяти для массива
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 10; // использование памяти
    }
 
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
 
    delete[] arr; // освобождение памяти
 
    return 0;
}

Утечки памяти

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

Пример утечки памяти:

void memoryLeak() {
    int* p = new int; // выделение памяти
    // потерян указатель на выделенную память, нет delete
}

Советы по управлению памятью

  1. Всегда освобождайте память: Для каждой операции new должна быть соответствующая операция delete.
  2. Используйте умные указатели: В C++11 и выше рекомендуется использовать умные указатели (std::unique_ptr, std::shared_ptr) для автоматического управления памятью.
  3. Инициализация указателей: Инициализируйте указатели нулем (nullptr), чтобы избежать случайного доступа к неинициализированной памяти.