有一点我不太明白。
如果我没弄错的话,在使用它时std::weak_ptr()
我们如何创建它很重要std::shared_ptr()
。
auto sp1 = std::shared_ptr<int>(new int(10)); // 1
auto sp2 = std::make_shared<int>(10); // 2
1和2的区别在于对象和控制块的内存分配(单独还是一起)。当我们使用时,std::weak_ptr()
我们可以检查它是否“过期”,即使强链接计数器= 0,只要存在std::weak_ptr()
控制块本身,它就会存在,在这里我终于得到了这个问题!
当我们通过 std::make_shared<>() 分配内存时,就只剩下weak_ptr
控制块本身了,但是由于我们一起分配了内存,并且对象似乎存在,那么这个对象或分配的内存会发生什么?
对象的析构函数总是在最后一个对象死亡时被调用
shared_ptr
,但这不一定与其内存的释放同时发生。如果使用
make_shared
,对象(+控制块)的内存将保持分配,直到控制块被删除。控制块实际上是一种行为的可能实现。
可以保证的是,当“从某处”复制
shared_ptr
指针时,它会使用原子读取(最有可能使用)use_count()
将使用计数器的值增加一。memory_order_relaxed
还需要记住的是,shared_ptr 还接收一个删除操作符作为输入,如果构造函数中发生异常,则可以在构造函数中调用该操作符。删除指针时,shared_ptr
将此值减一并使用指定的删除处理程序删除该指针。那些。当计数器为零时,对象可能已经存在,而当计数器重置时,对象可能仍然存在。
weak_ptr
读取相同计数器的值,如果为零,则认为该指针等同于nullptr
。这确保了值足够正确weak_ptr
。控制块是一种将计数器值链接到指针的结构。在构造时创建引用对象时计数器必须已经正确,
shared_ptr
并且在删除最后一个副本时它仍然必须存在weak_ptr
,这就是我们需要关心的全部。