shared_ptr::reset 只适用于原始指针?
shared_ptr::reset only works with raw pointers?
我一直看到智能指针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
,因为这不会影响共享 Widget 的其他指针。
从智能指针到原始指针的隐式转换是非常危险的。所以它不会发生。
如果一个智能指针认为它正在管理另一个智能指针正在管理的指针,那么两者都会认为他们有权清理它。当第二个清理时,通常会发生不好的事情。
原始指针不包含所有权信息。
另一方面,当您将一个共享指针分配给另一个共享指针时,有关指针生命周期的信息也会共享。所以两者合作管理指针的生命周期,最后一个离开 skope 进行清理。
我一直看到智能指针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
,因为这不会影响共享 Widget 的其他指针。
从智能指针到原始指针的隐式转换是非常危险的。所以它不会发生。
如果一个智能指针认为它正在管理另一个智能指针正在管理的指针,那么两者都会认为他们有权清理它。当第二个清理时,通常会发生不好的事情。
原始指针不包含所有权信息。
另一方面,当您将一个共享指针分配给另一个共享指针时,有关指针生命周期的信息也会共享。所以两者合作管理指针的生命周期,最后一个离开 skope 进行清理。