在下面的代码中,一个 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().
}
当它运行时(使用 VS2010 编译后),当容器被清除时会抛出“Oops...”。
问题:
- 这个代码合法吗?如果不是,为什么不呢?如果是这样,它应该扔吗?
- std 容器是否应该
clear()
以这样的方式实现,即在销毁其值期间,这些值不再作为容器可见。 - 应该
std::shared_ptr::get
,什么时候std::shared_ptr
销毁它的指针,返回nullptr
?