C++ - 指针和“智能指针”
Posted
技术标签:
【中文标题】C++ - 指针和“智能指针”【英文标题】:C++ - pointers and 'smart pointers' 【发布时间】:2014-04-05 11:38:40 【问题描述】:我正在学习如何正确使用指针和“智能指针”来防止内存泄漏。这是我正在分析的伪代码片段。 [ ClassA 和 ClassB 继承 BaseClass; ExtClass 只是一些外部类(与 BaseClass 无关]
main()
ExtClass *extPtr = new ExtClass();
BaseClass *ptr = new ClassA();
extPtr->setPtr(ptr);
extPtr->fun();
...
if(change_object())
delete ptr;
ptr = new ClassB();
extPtr->setPtr(ptr);
extPtr->fun();
-------------------------------------
ExtClass
private:
BaseClass *m_ptr;
public:
~ExtClass() delete m_ptr;
void ExtClass::fun()
m_ptr->do_some_stuff();
void ExtClass::setPtr(BaseClass *ptr)
m_ptr = ptr;
问题:
-
上面的例子正确吗?我的意思是不会有任何泄漏,对吧?
是否有可能以某种方式将普通指针保留在 ExtClass 中,并将“BaseClass *ptr”替换为 unique_ptr?或者应该是 shared_pointer?
【问题讨论】:
代码一点都不聪明。 我建议你看看valgrind
。这是一套很棒的软件,你可以在你的代码上运行。它将为您分析它并查找内存泄漏等。虽然我知道您在这里这样做是为了了解基础知识,但当您的代码变得更复杂时,您很有可能留下内存泄漏;因此,学习使用此类工具是您“无泄漏 C 代码”之旅的重要组成部分。
谢谢大家!我知道这根本不聪明,我只是在学习如何让它变得更好;)
看看this
也许你应该阅读关于自动存储持续时间和 RAII 的 abit
【参考方案1】:
基类好了,退出函数extPtr
会泄露。
要将智能指针与另一个交换,我相信这就是您想要的:http://en.cppreference.com/w/cpp/memory/unique_ptr/swap
顺便说一句,我在您的代码中根本看不到任何智能指针。
【讨论】:
以上是关于C++ - 指针和“智能指针”的主要内容,如果未能解决你的问题,请参考以下文章