1

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

4

1 回答 1

5

这些例子对吗?

前两个是错误的:他们尝试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)
于 2013-08-19T19:45:05.267 回答