C ++ - 指针和'智能指针'

时间:2014-04-05 11:38:40

标签: c++ pointers smart-pointers

我正在学习如何使用正确的指针和智能指针'防止内存泄漏。这是我正在分析的伪代码片段。 [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?

2 个答案:

答案 0 :(得分:0)

好的基类,如果退出函数,extPtr将被泄露。

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

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

答案 1 :(得分:0)

写一个真正的智能指针有很多问题,我在你的代码中看不到它们中的一些:

  1. 代码不安全,ExtClass没有明确定义的构造函数 和复制构造函数。

  2. 它不聪明,它不会避免复制内部指针 ExtClass

  3. 它应该能够避免裸分配。

  4. extPtr本身是一个裸指针(它可以泄漏)

  5. 如果在分配extPtrptr时抛出异常怎么办?

  6. 避免这些问题的最佳选择是使用标准智能指针,例如std::unique_ptr