使用unique_ptr和shared_ptr进行奇怪的段错误

ste*_*fen 3 c++ shared-ptr unique-ptr c++11

我遇到了一个奇怪的段错误.原因实际上导致我一个错误,但我仍然不明白为什么在这里引起分段错误......代码是:

#include <memory>
int main(int argc, char **arv)
{
    int *i = new int;
    std::unique_ptr<int> u1(i);
    std::unique_ptr<int> u2;
    u1 = std::move(u2); // line 7
    std::shared_ptr<int> s1(i); // line 8
    std::shared_ptr<int> s2;
    s2 = s1;
}
Run Code Online (Sandbox Code Playgroud)

我使用g ++ 4.6编译-std=c++0x并获得段错误.

如果我将第7行更改为u2 = std::move(u1);(那是错误),它就会消失.如果我将第8行更改为std::shared_ptr<int> s1(new int(3));(当然我不想要),它也会消失.如果我从第8行删除也没有段错误.

所以没有伤害,但我不明白为什么会有段错误.据我所知,
在第7行,一个空指针被分配给u1.没有重置(),没有范围的结束.然而i,从那以后似乎无效.是有意的吗?这意味着在移动指针时必须非常小心,因为另一个对象可能被破坏!

你怎么看?我如何保护自己免受这种伤害?

谢谢,斯蒂芬

Ker*_* SB 10

你的第8行是错误的:一旦你捕获iunique_ptr,你就不能再把它交给其他一些所有权对象了!每个所有者都会尝试删除*i,这是错误的.

相反,您应该从唯一指针创建共享指针:

std::shared_ptr<int> s1(std::move(u2));
Run Code Online (Sandbox Code Playgroud)

(此外,你必须u1u2南辕北辙.)

  • @steffen:的确,答案是"不要".没有针对`int*p = new int的保护; do_crazy_stuff(P); be_insane(P); take_ownership(P);`.编译器无法真正知道你要用指针做什么. (2认同)