【问题标题】:shared_ptr::reset only works with raw pointers?shared_ptr::reset 仅适用于原始指针?
【发布时间】:2017-11-03 17:29:20
【问题描述】:

我一直看到智能指针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;
}

提前谢谢你。

【问题讨论】:

  • “[..] 但它并没有说太多”它说resetT* 作为参数....
  • 哦,我认为您可以将智能指针传递给期望原始指针的函数?还是没有隐式转换?抱歉,我以前从未使用过智能指针。我认为情况就是这样(没有隐式转换),谢谢! @tobi303 - 你想回复这样我可以接受你的回答吗? :)

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


【解决方案1】:

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

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

您可以通过pw2 = pw; pw.reset(nullptr);pws 的所有权释放给pw2,因为这不会影响共享Widget 的其他指针。

【讨论】:

    【解决方案2】:

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

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

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

    另一方面,当您将一个共享指针分配给另一个共享指针时,指针的生命周期信息也会被共享。所以两者合作管理指针的生命周期,最后离开 skope 的负责清理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 2012-09-07
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      相关资源
      最近更新 更多