我想将一个成员指针作为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;
}
`
答案 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()
(为什么你想要一个小部件比它的包含窗口更长寿?)