C ++ unique_ptr () Использование - PullRequest
0 голосов
/ 10 марта 2019

Я просто хочу убедиться, что правильно понял ссылку.

Я получил класс A, который содержит уникальный указатель внутри его конструктора

class CDebug
{
//....
public:
    ~CDebug();
}

class A
{
public:
    A()
    {
        pDebug = unique_ptr<CDebug>(new CDebug());

        if(nullptr == pDebug)
        {
             CException ex("Nullpointer", __FILE__,__LINE__);
             throw ex;
        }
    }
private:
     unique_ptr<CDebug> pDebug;
}

Теперь, когда экземпляр A выходит из области видимости:

  1. Оператор удаления вызывается автоматически для уникального объекта Pointer освободить кучу
  2. Это заставляет Деструктор ~CDebug() бежать

Теперь я прав или у меня здесь утечки памяти?

1 Ответ

1 голос
/ 10 марта 2019

Чтобы ответить на ваш вопрос: нет, память не будет течь.Всякий раз, когда объект A выходит из области видимости, вызывается деструктор, где вызывается деструктор для CDebug и освобождается память.

Но так как я очень счастлив, когда люди хотят научиться использовать unique_ptr, я хотелвыделите две вещи с помощью кода.

Во-первых, проверка nullptr в конструкторе для A избыточна.

A()
{
    pDebug = unique_ptr<CDebug>(new CDebug()); //throws at bad allocation

    if(nullptr == pDebug) // will never be true
    {
         CException ex("Nullpointer", __FILE__,__LINE__);
         throw ex;
    }
}

, pDebug никогда не будет nullptr.Если выделение с новым сбоем, будет брошено std :: bad_alloc.Если, конечно, вы не работаете с компилятором, который не поддерживает обработку исключений.

Во-вторых - если у вас есть компилятор C ++ 14 - избегайте использования new.Создайте unique_ptr, вызвав std :: make_unique ().Преимущество не только в том, что new / delete удаляются из кода, но и в безопасности исключений (см. https://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/).

A()
{
    pDebug = std::make_unique<CDebug>();
    [...]
}

Кроме того, если вам не обязательно создавать исключение вкод, поместите конструкцию в список инициализатора.

A() : pDebug(std::make_unique<CDebug>()) {}
...