vde*_*ris 1 c++ smart-pointers std shared-ptr c++11
这是我第一次在C++中使用智能指针.我有一些问题std::shared_ptr:
通过引用设置指针:
MyToy mytoy_1, mytoy_2;
set_mytoy(mytoy_1, some_data);
set_mytoy(mytoy_2, some_data);
shared_ptr<MyToy> ptr_mytoy(&mytoy_1);
Run Code Online (Sandbox Code Playgroud)重置和新任务:
ptr_mytoy.reset(&mytoy_2);
Run Code Online (Sandbox Code Playgroud)没有分配重置:
ptr_mytoy.reset();
Run Code Online (Sandbox Code Playgroud)设置NULL(?):
ptr_mytoy(nullptr);
Run Code Online (Sandbox Code Playgroud)这些例子对吗?
如何检查智能指针是否为"空"(例如,之后.reset())或是否NULL?
这些例子对吗?
前两个是错误的:他们尝试shared_ptr使用对象初始化和重置,而不是指针.
更新:现在问题已经改变,从指针到自动变量初始化它们.这仍然是错误的:shared_ptr想要删除它们,删除任何未创建的内容是错误的new.
通常,对象将使用创建new,尽管最好用make_shared它来为您创建它:
// Good
auto ptr = make_shared<MyToy>();
// Not so good, but sometimes necessary
MyToy * mytoy_2 = new MyToy;
ptr.reset(mytoy_2);
Run Code Online (Sandbox Code Playgroud)
第三是正确的.它从指针释放对象,如果没有剩余的指针则删除它,并将指针留空.
第四个是可疑或错误,取决于是什么null_ptr.如果你的意思是nullptr,那么它是不正确的,不应该编译.如果它是一个空值指针MyToy,那么它将保留shared_ptr非空,但也不拥有任何东西.
如何检查智能指针是否为"空"(例如,在.reset()之后)
if (ptr.use_count() == 0)
Run Code Online (Sandbox Code Playgroud)
或者如果是NULL?
if (!ptr)
Run Code Online (Sandbox Code Playgroud)