1. ホーム
  2. c++

[解決済み] ダングリングポインタとは何ですか?

2022-03-02 06:22:46

質問

これはよくある質問だと思いますが、私にとってはまだ新しい質問です。

ダングリングポインタの概念がよくわからず、ググってテストメソッドを書いたりしていました。

これはダングリングポインタなんだろうか?私が見つけたどんな例も何かを返していたので、ここで私は似たようなことを試しているのです。

ありがとうございます。

void foo(const std::string name)
{
    // will it be Dangling pointer?!, with comments/Answer
    // it could be if in new_foo, I store name into Global.
    // Why?! And what is safe then?
    new_foo(name.c_str());
}

void new_foo(const char* name)
{
    // print name or do something with name...   
}

解決方法は?

ダングリングポインタとは、例えば無効なデータや、もう有効でないデータを指しているポインタのことです。

Class *object = new Class();
Class *object2 = object;

delete object;
object = nullptr;
// now object2 points to something which is not valid anymore

スタックに確保されたオブジェクトでも発生する可能性があります。

Object *method() {
  Object object;
  return &object;
}

Object *object2 = method();
// object2 points to an object which has been removed from stack after exiting the function

が返すポインタは c_str は、その後に文字列が変更されたり、破棄されたりすると、無効となる可能性があります。あなたの例では、文字列を変更することはないようですが const char *name そのコードが本質的に安全かどうかはわかりません。

例えば、ポインタをどこかに保存した後、対応する文字列が破壊されると、ポインタは無効になってしまいます。もし const char *name のスコープ内だけで new_foo (例えば、印刷のため)であれば、ポインターは有効なままです。