0

我想将成员指针设为 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;
}

`

4

1 回答 1

0

我不确定在包含类被销毁后 shared_ptr 本身是否还活着。

是一个成员,所以当shared_ptr包含的类被销毁时也会被销毁。

解决方案是复制shared_ptrie make widget()returnshared_ptr<Widget>而不是Widget*. 然后你可以这样做:

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

当您调用时,小部件仍然存在display()

(为什么你希望一个小部件的寿命比它的包含窗口长?)

于 2012-10-05T09:50:37.713 回答