-3
class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
}
int main(){
{
  A a= new A();
  delete a;
}

次のコードはどこでエラーをスローしますか.. ~A() がコンストラクターと同じように暗黙的に呼び出されるか、メイン関数でオブジェクト "a" が削除されます。前もって感謝します。

4

5 に答える 5

4

コードが次のように修正されたと仮定します。

class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
};
int main()
{
  A *a= new A();
  delete a;
}

デストラクタは、delete がオブジェクトが占有していたメモリを解放する前に、delete によって呼び出されます。

次のように、コードがスタックに を置いた場合:

class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
};
int main()
{
  A a;
} // <---- Here

デストラクタは、囲んでいるスコープの右中括弧の前に呼び出されます。この場合、外側のスコープは関数 main です。

しかし、次のように が別のブロック内に作成された場合:

class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
};
int main()
{
  if( 1 == 1 )
  {
      A a;
      // Do something with a
  } // <---- Here
}

デストラクタは、if ブロックの終了ブロックの直前に呼び出されます。ブロックを作成する場所でも同じことが言えます。for ループ内、while ループ内、または単にコード ブロックを中かっこで囲んだ場合でも。

于 2013-08-04T10:51:01.833 に答える
1

コンストラクタとデストラクタを宣言するときは、それらも定義する必要があります。そうしないと、コンパイラはいくつかのエラーを出します。あなたのものは宣言されたばかりです...

例:

クラステスト
{
公衆:
    test() {} //宣言および定義
    ~test() {} //宣言および定義
}
于 2013-08-04T10:45:06.857 に答える
0

私は@cppcodeに同意し、同じことを書いたでしょう。

しかし、私は行を追加します

A a= new A();

する必要があります

A *a= new A;

または、コンストラクタ/デストラクタを宣言しないでください。C++ がその作業を行います。

于 2013-08-04T10:52:37.323 に答える