【问题标题】:Do you need to tell Smart Pointers when you are done with them完成后是否需要告诉智能指针
【发布时间】:2016-01-22 12:25:27
【问题描述】:

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

类成员智能指针的行为(与释放内存、悬空指针有关)有什么不同吗?析构函数应该总是释放这些变量吗?

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;
}

【问题讨论】:

  • 这就是智能指针的全部意义所在。此外,release() 并没有像您认为的那样做。
  • 听起来你在考虑高于平均水平的指针。他们是不同的。
  • 为了完整起见,有一个例外,可以说是由于滥用智能指针造成的。如果你有一个循环依赖,最简单的是 A->B->A,那么你需要手动打破循环。在这种情况下,更好的设计是让一个对象拥有整个周期。

标签: c++ smart-pointers


【解决方案1】:

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

没有

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

是的

析构函数应该总是释放这些变量吗?

没有

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

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

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 2020-04-06
    • 2020-03-16
    • 2015-01-24
    • 1970-01-01
    • 2015-02-03
    • 2010-12-29
    • 2023-03-31
    相关资源
    最近更新 更多