【问题标题】:C++ - pointers and 'smart pointers'C++ - 指针和“智能指针”
【发布时间】: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;
    }
}

问题:

  1. 上面的例子正确吗?我的意思是不会有任何泄漏,对吧?
  2. 是否有可能以某种方式将普通指针保留在 ExtClass 中,并将“BaseClass *ptr”替换为 unique_ptr?或者应该是 shared_pointer?

【问题讨论】:

  • 代码一点都不聪明。
  • 我建议你看看valgrind。这是一套很棒的软件,你可以在你的代码上运行。它将为您分析它并查找内存泄漏等。虽然我知道您在这里这样做是为了了解基础知识,但当您的代码变得更复杂时,您很有可能留下内存泄漏;因此,学习使用此类工具是您“无泄漏 C 代码”之旅的重要组成部分。
  • 谢谢大家!我知道这根本不聪明,我只是在学习如何让它变得更好;)
  • 看看this
  • 也许你应该阅读关于自动存储持续时间和 RAII 的 abit

标签: c++ pointers smart-pointers


【解决方案1】:

基类好了,退出函数extPtr会泄露。

要将智能指针与另一个交换,我相信这就是您想要的:http://en.cppreference.com/w/cpp/memory/unique_ptr/swap

顺便说一句,我在您的代码中根本看不到任何智能指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多