Чтобы ответить на ваш вопрос: нет, память не будет течь.Всякий раз, когда объект 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>()) {}