Что произойдет, если перед освобождением памяти, выделенной новым оператором, произошло исключение? - PullRequest
0 голосов
/ 24 января 2019

Мне просто интересно узнать, что произойдет, если перед освобождением памяти, выделенной новым оператором, произошло исключение?Возникла ли проблема с утечкой памяти?

#include <iostream>
#include<new>

using namespace std;

void func()
{
    try
    {
        int *p = new int[10];

        /*
            Number of lines code here
            .
            .
            .
            .
            .
            Suppose here I got exception then What heppens????
            .
            .
            .
            .
        */
        delete []p;
    }
    catch(const std::exception& e)
    {
        cout<<"Exception occured"<<endl;
    }
}

int main() {
    func();
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Утечка памяти происходит из-за того, что оператор delete никогда не вызывался.Используйте std::unique_ptr<T> вместо необработанных указателей C ++.Стандартная библиотека C ++ предоставляет std::unique_ptr<T>, которая автоматически отменяет выделение обернутого указателя, когда он выходит из области видимости.Стандартная библиотека C ++ также предоставляет std::shared_ptr<T>, который использует подсчет ссылок и освобождает память только в случае освобождения последней ссылки на указатель.

0 голосов
/ 24 января 2019

Произошла ли проблема утечки памяти?

Да .В этом вся причина умных указателей и всей идиомы RAII.Деструкторы переменной области блока по-прежнему вызываются при обнаружении обработчика, поэтому они могут освободить выделенные ресурсы.Необработанный указатель просто утечет.

...