私は奇妙なセグメンテーションに遭遇しました。原因は、実際にバグに私を導いたが、セグメンテーションフォールトがここで発生している理由私はまだ理解していない...コードは次のとおりです。unique_ptrとshared_ptrを使った奇妙なsegfault
#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'でコンパイルするときに警告を出さなくてもいいということです。答えは本当にちょうど "Do not!"ですか? – steffen
@steffen:確かに、答えは「しない」です。 'int * p = new int;に対する保護はありません。 do_crazy_stuff(p); be_insane(p); take_ownership(p); 'コンパイラは、あなたがポインタを使って何をするのか本当に知ることができません。 –
真実...デ・妄想のおかげで:) – steffen