shared_ptr ::重置仅与原始指针一起使用
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
,因为这不会影响共享小部件的其他指针。
从智能指针到原始指针的隐性转换非常危险。所以它不会发生。
如果一个聪明的指针认为它正在管理另一个智能指针正在管理的指针,则两者都会认为他们有权清理它。当第二个进行清理时,通常会发生坏事。
原始指针不包含所有权信息。
另一方面,当您将一个共享指针分配给另一个指针时,也共享了有关指针寿命的信息。因此,这两个合作管理Pointer的寿命,最后一个离开Skope进行了清理。
相关文章:
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++指针无法更改其原始值
- 为包含原始指针的对象C++智能指针
- unique_ptr<T>::get() 返回的指针在原始unique_ptr被销毁后不是 nullptr
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上