小编Maa*_*ink的帖子

是否应该在stl容器调用其值的析构函数之前或之后结束所有权?

在以下代码中,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 ...".

问题:

  1. 这段代码合法吗?如果没有,为什么不呢?如果是这样,它应该抛出?
  2. 如果std容器应该clear()以这样的方式实现,即在其值的破坏期间,这些值不再作为容器可见.
  3. 应该std::shared_ptr::get在什么时候std::shared_ptr摧毁它的指针nullptr呢?

c++ c++11 st

5
推荐指数
1
解决办法
142
查看次数

标签 统计

c++ ×1

c++11 ×1

st ×1