shared_ptr ::重置仅与原始指针一起使用

shared_ptr::reset only works with raw pointers?

本文关键字:指针 原始 一起 ptr shared      更新时间:2023-10-16

我一直看到智能指针reset功能与原始指针一起使用。当我尝试将另一个智能指针传递给它时,它会失败。我在这里看:http://en.cppreference.com/w/cpp/memory/shared_ptr/reset但这并不多。只是想确认是否是这种情况?我的代码在这里:https://wandbox.org/permlink/xkntjhjgeoszs7kn也在这里为您提供方便:

#include<iostream>
using std::cout; using std::endl;
#include<memory>
using std::shared_ptr;
class Widget
{
public:
  ~Widget()
  {
    cout << "Hi from destructor" << endl;
  }
};
auto wdel = [](Widget* pw)
            {
              cout << "Hi from custom deleter" << endl;
              delete pw;
            };
int main()
{
  {
    shared_ptr<Widget> pw(nullptr,wdel);
    pw.reset(new Widget);
    cout << "Done reset" << endl;
    shared_ptr<Widget> pw2(nullptr,wdel);
    // pw = pw2;   // this works
    pw2.reset(pw); // this does not work
  }
  return 0;
}

预先感谢您。

pw2 = pw是正确的东西,只有副本(使用 shared_ptr::operator&shared_ptr::shared_ptr(才能正确。

考虑是否有第三个shared_ptr。保留所有权的权利与pw一样多,因此pw不能允许在其他地方转移所有权。

您可以执行pw2 = pw; pw.reset(nullptr);以将pw的所有权发布给pw2,因为这不会影响共享小部件的其他指针。

从智能指针到原始指针的隐性转换非常危险。所以它不会发生。

如果一个聪明的指针认为它正在管理另一个智能指针正在管理的指针,则两者都会认为他们有权清理它。当第二个进行清理时,通常会发生坏事。

原始指针不包含所有权信息。

另一方面,当您将一个共享指针分配给另一个指针时,也共享了有关指针寿命的信息。因此,这两个合作管理Pointer的寿命,最后一个离开Skope进行了清理。