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()returnをコピーすることです。次に、次のことができます。shared_ptr<Widget>Widget*

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

呼び出してもウィジェットは引き続き存在しますdisplay()

(ただし、ウィジェットを含むウィンドウよりも長く存続させたいのはなぜですか?)

于 2012-10-05T09:50:37.713 に答える