我第一次在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);
重置并重新分配:
ptr_mytoy.reset(&mytoy_2);
无需转让即可重置:
ptr_mytoy.reset();
设置NULL
(?):
ptr_mytoy(nullptr);
这些例子是对的吗?
如何检查智能指针“为空”(例如,.reset()
之后)或NULL
是否为<{1}}?
答案 0 :(得分:5)
这些例子是对的吗?
前两个是错误的:他们尝试用对象初始化和重置shared_ptr
,而不是指针。
UPDATE :现在已经更改了问题,以便从指向自动变量的指针初始化它们。这仍然是错误的: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);
第三个是正确的。它从指针释放对象,如果没有剩余的指针则删除它,并将指针留空。
第四个是可疑或错误,取决于null_ptr
是什么。如果你的意思是nullptr
,那么它是不正确的,不应该编译。如果它是指向MyToy
的空值指针,那么它会使shared_ptr
非空,但不会拥有任何内容。
如何检查智能指针是否为“空”(例如,在.reset()之后)
if (ptr.use_count() == 0)
或者如果是NULL?
if (!ptr)