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

vde*_*ris 1 c++ smart-pointers std shared-ptr c++11

这是我第一次在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);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重置和新任务:

    ptr_mytoy.reset(&mytoy_2);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 没有分配重置:

    ptr_mytoy.reset();
    
    Run Code Online (Sandbox Code Playgroud)
  4. 设置NULL(?):

    ptr_mytoy(nullptr);
    
    Run Code Online (Sandbox Code Playgroud)

这些例子对吗?

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

Mik*_*our 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);
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)