将shared_ptr作为成员正确的想法吗?

时间:2012-10-04 11:34:59

标签: shared-ptr

我想将一个成员指针作为shared_ptr,但我不确定在包含的类被销毁之后shared_ptr本身是否存活。 我测试了下面的代码,但我不确定它在运行时是否正确?

using std::cout;
using std::cin;
using std::endl;

class Widget
{
public:
    Widget()
    {
        cout<<__FUNCTION__<<"()"<<endl;
    }

    ~Widget()
    {
        cout<<__FUNCTION__<<"()"<<endl;
    }
    void display()
    {
        cout<<"the smart pointers are really smart"<<endl;
    }
private:
};

class Window
{
public:
    Window()
        :widget_(new Widget())
    {

    }

    Widget* widget()
    {
        return widget_.get();
    }


private:
    std::shared_ptr<Widget> widget_;
};

int main()
{

    Widget* outer = nullptr;
    {
        Window wind;
        outer = wind.widget();
    }

    outer->display();

    cout<<"enter"<<endl;
    cin.get();
    return 0;
}

`

1 个答案:

答案 0 :(得分:0)

  

我不确定在包含类被销毁之后shared_ptr本身是否存在。

shared_ptr是成员,因此在销毁包含类时将被销毁。

解决方案是复制shared_ptr,即make widget()返回shared_ptr<Widget>而不是Widget*。然后你可以这样做:

shared_ptr<Widget> outer;
{
    Window wind;
    outer = wind.widget();
}
outer->display();

当您致电display()

时,小部件仍然存在

(为什么你想要一个小部件比它的包含窗口更长寿?)