当你完成它们时,你需要告诉Smart Pointers吗?

时间:2016-01-22 04:19:09

标签: c++ smart-pointers

使用智能指针,您是否仍需要释放/重置它们以确保释放内存?或者让它们超出范围是否可以?

对于类成员智能指针,行为方面是否存在任何差异 - 与释放内存,悬挂指针有关?析构函数是否应始终释放这些变量?

class Foo
{
public:
    Foo()
    {
        myUPtr = std::unique_ptr<int>(new int);
        mySPtr = std::shared_ptr<int>(new int);
    }

    ~Foo()
    {
        // Should these smart pointers be released? Or will falling out of scope/deletion release the memory?
        myUPtr.release();
        mySPtr.reset();
    }

private:
    std::unique_ptr<int> myUPtr;
    std::shared_ptr<int> mySPtr;
};

int main()
{
    // When each of the below variables fall out of scope is there any difference in memory release? 
    Foo f;
    std::unique_ptr<Foo> uFoo(new Foo);
    std::shared_ptr<Foo> sFoo(new Foo);
    std::unique_ptr<int> uPtr(new int);
    std::shared_ptr<int> sPtr(new int);

    // Will all these smart pointers be released automatically? 
    // No need to call .release()/.reset() on any member and non-member smart pointers?

    return 0;
}

1 个答案:

答案 0 :(得分:5)

  

你是否仍然需要释放/重置它们以确保释放内存?

没有

  

或者让它们超出范围可以吗?

  

析构函数是否应始终释放这些变量?

没有

使智能指针如此智能和强大的一个原因是您不再需要担心手动管理内存。

仅供参考,std::unique_ptr::release实际上将释放其职责的智能指针:它返回一个原始指针,然后您需要手动管理。