智能指针:通过引用设置,重置,设置空值,空值检查或重置检查

时间:2013-08-19 19:33:33

标签: c++ c++11 std shared-ptr smart-pointers

我第一次在C ++中使用智能指针。 我有一些关于std::shared_ptr的问题:

  1. 按引用设置指针:

    MyToy mytoy_1, mytoy_2;
    set_mytoy(mytoy_1, some_data);
    set_mytoy(mytoy_2, some_data); 
    
    shared_ptr<MyToy> ptr_mytoy(&mytoy_1);
    
  2. 重置并重新分配:

    ptr_mytoy.reset(&mytoy_2);
    
  3. 无需转让即可重置:

    ptr_mytoy.reset();
    
  4. 设置NULL(?):

    ptr_mytoy(nullptr);
    
  5. 这些例子是对的吗?

    如何检查智能指针“为空”(例如,.reset()之后)或NULL是否为<{1}}?

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)