【问题标题】:Smart pointer: set by reference, reset, set null, null-check or reset-check智能指针:通过引用设置、重置、设置 null、null-check 或 reset-check
【发布时间】:2013-08-21 17:09:05
【问题描述】:

我第一次在 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);
    

这些例子对吗?

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

【问题讨论】:

  • 请仔细阅读your previous question的选定答​​案。
  • @juanchopanza 在我之前的问题中,我没有问任何关于 null/reset 检查的问题。
  • 不,但你仍然在误用shared_ptr。

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


【解决方案1】:

这些例子对吗?

前两个是错误的:他们尝试使用对象而不是指针来初始化和重置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);

第三个是正确的。它从指针中释放对象,如果没有剩余指针则将其删除,并将指针留空。

第四个是可疑的还是错误的,这取决于null_ptr 是什么。如果你的意思是nullptr,那么它是不正确的,不应该编译。如果它是一个指向MyToy 的空值指针,那么它会使shared_ptr 非空,但也不拥有任何东西。

如何检查智能指针是否为“空”(例如,在 .reset() 之后)

if (ptr.use_count() == 0)

或者如果是NULL?

if (!ptr)

【讨论】:

  • 对不起,在我的前两个示例中,我忘记了&amp;。
  • @vdenotaris:好吧,这是错误的,原因不同。我马上更新答案...
  • 非常感谢。对于第一个示例:我没有使用new,因为我(在我的真实情况下)将我的 shared_ptr 与容器内按值存储的结构相关联。
  • @vdenotaris:在这种情况下,您根本不应该使用shared_ptr,因为您没有共享对对象生命周期的控制权。容器拥有对象的独占所有权。
  • 是否有有效的方法从容器中获得对象的所有权,或者我只能使用值(而不是指针)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2016-03-01
  • 2020-06-27
  • 2015-02-24
  • 1970-01-01
相关资源
最近更新 更多