3

オブジェクトがそのまま存在する場合:

MyClass obj;

メンバー関数を呼び出すには:

obj.myMemberFunction();

次に、目的を達成した後にそのオブジェクトのデストラクタを呼び出します。

delete obj;

ただし、オブジェクトへのポインターがあるとしましょう。

MyClass* obj;

メンバー関数を呼び出すには:

obj->myMemberFunction();

さて...このオブジェクトでデストラクタを呼び出すにはどうすればよいですか?

4

4 に答える 4

6

あなたはそれを逆に持っています。最初のdeleteケースではなく、 2番目のケースで行います。

MyClass obj;
obj.myMemberFunction();
//delete obj;
//^^^^^^^^^^^
// NO! `obj` has automatic storage and will
// be destroyed automatically when it goes out
// of scope.

delete動的に割り当てられたオブジェクトへのポインタが必要です。

MyClass* obj = new MyClass;
obj->myMemberFunction();
delete obj;
于 2012-11-03T17:16:43.637 に答える
2

で作成した場合

MyClass obj;

あなたはそれを削除するために何もしません。で作成した場合

MyClass* obj = new MyClass();

あなたが使う

delete obj;

削除します。

于 2012-11-03T17:17:22.543 に答える
2

演算子deleteは、対応する演算子newのおかげで、ヒープに割り当てられた領域のアドレスを格納するポインターで使用することを目的としています。

void function () 
{
  int * pt;

  pt = new int;

  *pt = 42;

  delete pt; // memory released
}

スタックに割り当てられたメモリは、対応するスコープの最後で自動的に解放されます。

void function () 
{
  int i;

  i = 42;

} // memory released
于 2012-11-03T17:26:14.960 に答える
0

を書き込むMyClass obj;と、オブジェクトはヒープではなくスタックに割り当てられます。この場合、オブジェクトは自動的に破棄され、スコープ外になります。コンパイラは、デストラクタが呼び出されるようにするためのコードを生成します。したがって、オブジェクトを明示的に削除しないでください。

deleteオブジェクトがヒープに割り当てられるときに使用されます。例えば:

MyClass* pobj = new MyClass;
// Do something with pobj...
delete pobj;
于 2012-11-03T17:18:33.823 に答える