我只想确保我正确理解参考文献。
我有一个包含A的类,它在其构造函数中设置唯一指针
类CDebug{// ….上市: 〜CDEBUG();}
…
回答你的问题:不,记忆不会泄露。每当对象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>()) {}