1

次のコードでは、コンストラクタとデストラクタをプライベートにし、独自のインスタンス化および削除関数を作成しました。しかし、Delete()関数を呼び出すと、そのdelete this中のステートメントはオブジェクトを削除しているように見えますが、コンパイラーに通知していないため、オブジェクトはまだ存在していると見なされます。ポインタをnullまたはゼロに設定するのは良い考えだと思ったのでthis = 0、deleteステートメントの前にaを付けましたが、まったく機能しませんでした。Delete()オブジェクトとそのポインタを完全に削除するには、関数内に何を入れる必要がありますか?

class MyClass
{
private:
  MyClass() {}
 ~MyClass() {}
public:
  static MyClass *Instantiate()
  {
    MyClass *inst = new MyClass;
    return inst;
  }
  void Delete()
  {
    delete this;
  }
};

int main()
{
  MyClass *inst1 = MyClass::Instantiate();
  inst1->Delete();
  return 0;
}
4

2 に答える 2

3

あなたはそれを明示的に表現していませんでしたが、なぜを呼び出した後にそうinst1でないのか疑問に思っていると思います. もしそうなら、これを考慮してください:NULLDelete()

指しているオブジェクトを正常にinst1->Delete();削除します。inst1ただし、ポインターinst1は変更されません。の有効なインスタンスではなくなったメモリ内のどこかを指すだけですMyClass

また、メンバー関数が を呼び出すことは非常にまれですがdelete this、構文的にも意味的にもあなたの例には何の問題もありません。

于 2013-03-03T17:04:15.347 に答える
2

これはできません。オブジェクトへのポインターは、オブジェクト自体がアクセスできないため、外部で管理する必要があります (thisはローカルの自己参照ポインターであり、それ以外のものを表していません)。

ポインターを自動的に追跡したい場合は、スマート ポインター クラス ( http://en.wikipedia.org/wiki/Smart_pointer#C.2B.2B_smart_pointers ) を使用します。しかし、dtor を非公開にしたため、その機能は失われます。もちろん、独自のスマート ポインター クラスを作成することもできます。

于 2013-03-03T17:04:05.907 に答える