在以下代码中,X在全局容器中注册,该容器成为其共享所有者.X的析构函数测试它不再是这种所有权的一部分了,我希望它是被破坏的有效前提条件.
#include <vector>
#include <memory>
struct X {
~X();
};
std::vector<std::shared_ptr<X> > global_x_reg;
X::~X()
{
for (auto iter = global_x_reg.begin(), end = global_x_reg.end(); iter != end; ++iter)
if (iter->get() == this)
throw "Oops. X gets destroyed while it is still owned!";
}
int main(int argc, char** argv)
{
global_x_reg.push_back( std::shared_ptr<X>(new X) );
global_x_reg.clear(); // calls X::~X().
}
Run Code Online (Sandbox Code Playgroud)
当它运行时(在使用VS2010编译之后),当清除容器时抛出"Oops ...".
问题:
clear()以这样的方式实现,即在其值的破坏期间,这些值不再作为容器可见. std::shared_ptr::get在什么时候std::shared_ptr摧毁它的指针nullptr呢?