Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-指针和';智能指针&x27;_C++_Pointers_Smart Pointers - Fatal编程技术网

C++ C++;-指针和';智能指针&x27;

C++ C++;-指针和';智能指针&x27;,c++,pointers,smart-pointers,C++,Pointers,Smart Pointers,我正在学习如何正确使用指针和“智能指针”来防止内存泄漏。这是我正在分析的一段伪代码。 [ClassA和ClassB继承基类;ExtClass只是一些外部类(与基类无关) main(){ ExtClass *extPtr = new ExtClass(); BaseClass *ptr = new ClassA(); extPtr->setPtr(ptr); extPtr->fun(); ... if(change_object()

我正在学习如何正确使用指针和“智能指针”来防止内存泄漏。这是我正在分析的一段伪代码。 [ClassA和ClassB继承基类;ExtClass只是一些外部类(与基类无关)

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”替换为唯一的\u ptr?或者它应该是共享的\u指针

  • 对于基类,如果退出函数,
    extPtr
    将泄漏

    要将一个智能指针与另一个智能指针交换,我相信这就是您想要的:


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

    代码一点也不智能。我建议你看看
    valgrind
    。这是一套很棒的软件,你可以在代码上运行。它将为你分析它,并查找内存泄漏等。我知道你在这里这么做是为了了解基本原理,而不是当你的代码变得更复杂时,你留下内存泄漏的可能性很大;因此,学习使用这些工具是你“无泄漏C代码”之旅的一个重要部分。谢谢各位!我知道这一点都不聪明,我只是在学习如何改进;)看一看也许你应该读一本关于自动存储持续时间和RAII的书