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++ - 指针和“智能指针”的主要内容,如果未能解决你的问题,请参考以下文章

C++原生指针,引用与智能指针

C++ - 指针和“智能指针”

C++智能指针

C++ 智能指针性能

C++智能指针

C++智能指针简述:智能指针总结及补充