0

クラスのデストラクタの実装について質問があります。〜演算子を使用するのが正しい方法であることは理解していますが、次のコードを見てください。

class foo
{
private:
int* abc;

public:
foo()
{
abc = new int(2);
}

~foo()
{
delete abc;
}

void func()
{
delete abc;
}
}

ここで、main関数が次のように定義されているとしましょう。

int main(int argc, char** argv)
{
foo a;
a.func();
}

mainでfunc()の関数を呼び出すと、これはデストラクタとまったく同じように機能しますか?同様の設定でのデストラクタとこの関数の違いは何ですか?

4

2 に答える 2

5

func()~foo()まったく同じことをします。そしてそれが問題です。aスコープ外になると、そのデストラクタが~foo()自動的に呼び出され、2回abc削除されます。これを回避する1つの方法は、後の最後に設定することです。これにより、デストラクタが呼び出されたときにポインタが呼び出されます。これは、実際には何も行われず、有効な操作であるC++の特殊なケースです。abcNULLfunc()deletedeleteNULL

または、もちろん、実際に意味があり、何かを達成する方法でコードを書き直すこともできます。

func()そして、本当に明確にするために、との間の「違い」は~foo()、彼らが何をするかではなく、彼らがどのように/いつ呼ばれるかです。func()はユーザーによって手動で呼び出され~foo()ますが、変数がスコープ外になると自動的に呼び出されます。func()ゼロ回以上呼び出される場合がありますが(プログラマー次第です)、コンパイラーは~foo()このコードで1回だけ(それ以上でもそれ以下でも)呼び出されます。

于 2013-01-12T08:33:45.040 に答える
1

定義の明らかな違いを超えるいくつかの違い。

デストラクタ

  • スコープの最後または呼び出し時に自動的に呼び出され、delete手動で呼び出すことができますが、めったに良い考えではありません

  • メンバー変数と基本クラスのデストラクタを呼び出します。

ミル方式の実行

  • 手動で呼び出されます

この特定のケースでは、基本クラスはなく、メンバーフィールドのみint *がデストラクタを持たないptrであるため、この場合、呼び出し方法を除いて同一です。

于 2013-01-12T08:31:49.597 に答える