我可以记得std :: weak_ptr吗?

Gam*_*ure -4 c++ shared-ptr weak-ptr data-representation c++11

首先,一个典型的实施是std::weak_ptr什么?特别是std::weak_ptr只是一个控制块的指针std::shared_ptr?

如果所有std::shared_ptr引用都消失了,内部控制块是否被删除?如果是这样,std::weak_ptr::expired()如果重新使用该内存,如何正常运行?


我有一个包含a的对象,std::weak_ptr我想memcpy将对象转换为稍后要处理的缓冲区.这样做会以某种方式打破智能指针的内部工作吗?

lis*_*rus 5

当所有std::shared_ptr对象都消失后,控制块仍然存在(这就是std::weak_ptr工作方式),只删除引用的对象.

现在,只有C++对象可以轻松复制,std::memcpy 才能安全地复制它.检查TriviallyCopyable概念的要求,我们看到std::weak_ptr由于具有非平凡的复制构造函数而无法满足它.实际上,这个构造函数会增加控制块内的弱指针计数器,因此复制它std::memcpy会破坏其不变量.

说实话,std::weak_ptr在普通代码中存储一个原始缓冲区听起来很糟糕.缓冲区通常用于序列化,发送/写入数据等,所有这些任务对于智能指针都是无意义的.但是,如果您确定需要将其存储在缓冲区中,则需要放置new:

std::weak_ptr<T> the_one_i_want_to_copy;

std::weak_ptr<T> * buffer = ...;
new (buffer) std::weak_ptr<T> { the_one_i_want_to_copy };
Run Code Online (Sandbox Code Playgroud)

注意(buffer)after new:它告诉new不要分配内存,而是使用已经准备好的地方(因此放置新的).准备时buffer,请务必提供所需的尺寸和对齐方式.