我只想确保我正确理解了参考文献。
我得到了一个类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的实例离开其作用域时:
~CDebug()
运行现在我是对的还是在这里出现内存泄漏?
答案 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>()) {}