3

デストラクタを理解しようとしています。次の問題が発生しました。以下のスニペットでは、オブジェクトb2がデストラクタのスコープ外にある理由を説明します。

class D
{
   B *b1;
   public:
   D()
   {
       b1 = new B;
       B *b2=new B;
       cout<<"D's Constructor Invoked"<<endl;
       //delete b2;
   }
   ~D()
   {
       delete b1;
       delete b2;  // error : undeclared identifier
       cout<<"D's Destructor Invoked"<<endl;
   }
};

Bは単純なクラスです。

ありがとう

4

4 に答える 4

2

b2コンストラクターに対してローカルな変数です。あなたがやろうとしていることは本質的に以下と同等です:

   void f()
   {
       B *b2=new B;
   }

   void g()
   {
       delete b2;  // error : undeclared identifier
   }

なぜそれが機能しないのか理解していると思います。(g独自のスコープと独自のローカル変数のセットがあり、それらとは素ですf。)

代わりにb2、メンバー変数を作成します。

class D
{
   B *b1;
   B *b2;
   public:
   D()
   {
       b1 = new B;
       b2 = new B;
       cout<<"D's Constructor Invoked"<<endl;
   }
   ~D()
   {
       delete b1;
       delete b2;  // works!
       cout<<"D's Destructor Invoked"<<endl;
   }
};
于 2012-06-29T11:19:48.793 に答える
1

別の関数のローカル変数だからです。これは、以下がコンパイルされないのと同じ理由です。

void do_something() {
    int answer = 42;
    frob(answer);
}

void do_something_else_completely_unrelated() {
    answer = 23; // what? there's no "answer" in scope!
}
于 2012-06-29T11:19:36.327 に答える
0

b2のスコープは、宣言したブロックであり、コンストラクターです。

于 2012-06-29T11:19:50.887 に答える
0

オブジェクト b2 はコンストラクター (ローカル) 内で定義されます。つまり、中括弧の外ではアクセスできません。したがって、デストラクタには b2 の存在についての手がかりがありません。一方、b1 はクラス メンバーとして作成され、表示されます。

これを読んでスコープについて理解する

于 2012-06-29T11:19:58.230 に答える