我来到一个奇怪的段错误。原因居然使我的错误,但我还是不明白为什么一个分割故障导致这里...代码是:奇怪的段错误与unique_ptr和shared_ptr
#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;
}
我编译G ++ 4.6和-std=c++0x
,并得到一个段错误。
如果我将第7行更改为u2 = std::move(u1);
(即错误),它会消失。 如果我将第8行更改为std::shared_ptr<int> s1(new int(3));
(当然我不想),它也会消失。如果我从第8行删除也没有段错误。
所以没有伤害,但我不明白为什么应该有一个段错误。据我了解,
在第7行空指针分配给u1。没有重置(),没有范围的结束。尽管如此,i
似乎从那里无效。这是否满足?这意味着移动指针时必须非常小心,因为另一个对象可能会被销毁!
您认为如何?我该如何保护自己?
谢谢,斯特芬
困扰我的是,我可以用'-pedantic -Wall -Wextra'编译时甚至不会发出警告。答案真的只是“不要!”? – steffen
@steffen:的确,答案是“不要”。没有保护'int * p = new int; do_crazy_stuff(P); be_insane(P); take_ownership(P);'。编译器无法真正知道你将如何处理指针。 –
真的......感谢您的妄想:) – steffen