C ++ unique_ptr()用法

时间:2019-03-10 16:17:17

标签: c++ unique-ptr

我只想确保我正确理解了参考文献。

我得到了一个类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的实例离开其作用域时:

    在唯一的Pointer对象上自动调用
  1. Delete Operator 释放堆
  2. 这将迫使析构函数~CDebug()运行

现在我是对的还是在这里出现内存泄漏?

1 个答案:

答案 0 :(得分:1)

要回答您的问题:不,不会泄漏内存。每当对象A超出范围时,将调用析构函数,其中将调用CDebug的析构函数并释放内存。

但是当人们想学习如何使用unique_ptr时,我感到非常高兴,我想在代码中指出两点。

首先,在A的构造函数中进行nullptr检查是多余的。

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。如果使用new分配失败,则将抛出std :: bad_alloc。当然,除非您使用的是不支持异常处理的编译器。

其次-假设您有C ++ 14编译器-避免使用new。通过调用std :: make_unique()创建一个unique_ptr。不仅具有从代码中删除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>()) {}