Рубрики

операторы new и delete в C ++ для динамической памяти

Динамическое распределение памяти в C / C ++ относится к выполнению выделения памяти вручную программистом. Динамически распределенная память распределяется по куче, а нестатические и локальные переменные распределяются по стеку (подробности см. В разделе Программы на языке C ).

Какие приложения?

  • Одно из применений динамически распределяемой памяти — это выделение памяти переменного размера, что невозможно с выделенной компилятором памятью, за исключением массивов переменной длины .
  • Самое важное использование — это гибкость, предоставляемая программистам. Мы свободны распределять и освобождать память всякий раз, когда нам нужно и когда мы больше не нужны. Есть много случаев, когда эта гибкость помогает. Примерами таких случаев являются связанный список , дерево и т. Д.

Чем он отличается от памяти, выделенной нормальным переменным?
Для обычных переменных, таких как «int a», «char str [10]» и т. Д., Память автоматически выделяется и освобождается. Для динамически выделяемой памяти, такой как «int * p = new int [10]», программисты обязаны освобождать память, когда она больше не нужна. Если программист не освобождает память, это вызывает утечку памяти (память не освобождается, пока программа не завершится).

Как распределяется / освобождается память в C ++?
C использует функции malloc () и calloc () для динамического выделения памяти во время выполнения и использует функцию free () для освобождения динамически выделяемой памяти. C ++ поддерживает эти функции, а также имеет два новых и удаляемых оператора, которые выполняют задачу выделения и освобождения памяти лучше и проще.

Эта статья посвящена новым и удаляемым операторам.

новый оператор

Оператор new обозначает запрос на выделение памяти в куче. Если доступно достаточно памяти, оператор new инициализирует память и возвращает адрес вновь выделенной и инициализированной памяти переменной-указателю.

  • Синтаксис для использования нового оператора : Чтобы выделить память любого типа данных, синтаксис:
    pointer-variable = new data-type;
    

    Здесь указатель-переменная является указателем типа data-type. Тип данных может быть любым встроенным типом данных, включая массив, или любые пользовательские типы данных, включая структуру и класс.
    Пример:

    // Pointer initialized with NULL
    // Then request memory for the variable
    int *p = NULL; 
    p = new int;   
    
                OR
    
    // Combine declaration of pointer 
    // and their assignment
    int *p = new int; 
    
  • Инициализация памяти: мы также можем инициализировать память, используя новый оператор:
    pointer-variable = new data-type(value);
    Example:
    int *p = new int(25);
    float *q = new float(75.25);
    
  • Выделить блок памяти: оператор new также используется для выделения блока (массива) памяти типа data-type .
    pointer-variable = new data-type[size];
    

    где размер (переменная) указывает количество элементов в массиве.

    Example:
            int *p = new int[10]
    

    Динамически распределяет память для 10 целых чисел непрерывно типа int и возвращает указатель на первый элемент последовательности, который назначен p (указатель). p [0] относится к первому элементу, p [1] относится ко второму элементу и так далее.

Нормальное объявление массива против использования нового
Существует разница между объявлением обычного массива и выделением блока памяти с использованием new. Наиболее важным отличием является то, что нормальные массивы освобождаются компилятором (если массив локальный, то освобождается, когда функция возвращается или завершает работу). Однако динамически распределяемые массивы всегда остаются там, пока они не будут освобождены программистом или программа не завершится.

Что, если во время выполнения недостаточно памяти?
Если в куче недостаточно памяти для выделения, новый запрос указывает на ошибку, генерируя исключение типа std :: bad_alloc, если только оператор nothrow не используется с оператором new, и в этом случае он возвращает указатель NULL (прокрутите до раздел «Обработка исключений нового оператора» в этой статье). Поэтому, может быть хорошей идеей проверить переменную указателя, созданную new, прежде чем использовать ее в программе.

int *p = new(nothrow) int;
if (!p)
{
   cout << "Memory allocation failed\n";
}

удалить оператор

Поскольку ответственность за освобождение динамически распределенной памяти лежит на программисте, программистам предоставляется оператор delete на языке C ++.
Синтаксис:

// Release memory pointed by pointer-variable
delete pointer-variable;  

Здесь указатель-переменная является указателем, который указывает на объект данных, созданный new .
Примеры:

  delete p;
  delete q;

Чтобы освободить динамически размещенный массив, на который указывает указатель-переменная, используйте следующую форму удаления :

// Release block of memory 
// pointed by pointer-variable
delete[] pointer-variable;  

Example:
   // It will free the entire array
   // pointed by p.
   delete[] p;

// C ++ программа для иллюстрации динамического размещения
// и освобождение памяти с использованием new и delete
#include <iostream>

using namespace std;

  

int main ()

{

    // Инициализация указателя на ноль

    int* p = NULL;

  

    // Запрашиваем память для переменной

    // используя новый оператор

    p = new(nothrow) int;

    if (!p)

        cout << "allocation of memory failed\n";

    else

    {

        // Сохраняем значение по выделенному адресу

        *p = 29;

        cout << "Value of p: " << *p << endl;

    }

  

    // Запрос блока памяти

    // используя новый оператор

    float *r = new float(75.25);

  

    cout << "Value of r: " << *r << endl;

  

    // Запрос блока памяти размером n

    int n = 5;

    int *q = new(nothrow) int[n];

  

    if (!q)

        cout << "allocation of memory failed\n";

    else

    {

        for (int i = 0; i < n; i++)

            q[i] = i+1;

  

        cout << "Value store in block of memory: ";

        for (int i = 0; i < n; i++)

            cout << q[i] << " ";

    }

  

    // освободил выделенную память

    delete p;

    delete r;

  

    // освободил блок выделенной памяти

    delete[] q;

  

    return 0;

}

Выход:

Value of p: 29
Value of r: 75.25
Value store in block of memory: 1 2 3 4 5 


Статьи по Теме:

Эта статья предоставлена Акашем Гуптой . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

операторы new и delete в C ++ для динамической памяти

0.00 (0%) 0 votes