2017-05-15 4 views
-1

は次のように行ってきました:デストラクタはなぜここで一度しか呼び出されないのですか?私はupcomming試験や質問のいずれかの古い試験問題を見てい

//How many times is Foo's destructor called when func() is called? 
void func(){ 
    Foo a; 
    for (int i = 0; i < 10; i++){ 
     Foo *c = new Foo(); 
     a = *c; 
    } 
} 

、正しい答えは、誰もがそれがために一度呼び出されていませんどのように私に説明することができます。1.ましたそれぞれの新しいFooはfor-loopで作成されましたか?

+7

「新しいもの」の読み上げ時期。 – juanchopanza

+2

ヒープ上にオブジェクトを割り当てると(つまり、 'new'キーワードを介して)、デストラクタを明示的に呼び出す必要があります。デストラクタへの唯一の暗黙の呼び出しは、 'a'が有効範囲外になるとき、すなわち' func() 'が終了するときです。 – freakish

答えて

2

のは、あなたのコードが実際にやっているか見てみましょう:

void func(){ 
    Foo a; // Creates an object in the stack that will be destroyed once the function scope is no longer valid (meaning, when the function call is finished). 
    for (int i = 0; i < 10; i++){ 
     Foo *c = new Foo(); // this line allocates memory for a new object and stores a pointer to that memory in 'c' 
     a = *c; // Makes a field-by-field copy (to put it simple) of the memory pointed by c into the object a. No new memory is allocated, no memory is destroyed 
    } 
} 

をあなたが見ることができるように、new Foo()によって割り当てられたメモリが破壊されることはなかった、あなたはそれを達成するためにいくつかの点でdelete c;を呼び出す必要があります。

3

newでオブジェクトを作成するときは、デストラクタが呼び出されメモリが解放されるようにdeleteでオブジェクトを削除する必要があります。したがって、呼び出されるデストラクタを持つ唯一のオブジェクトはaです。このオブジェクトは、静的に作成され、funcが終了すると破棄されます。

+2

OPがそれを認識しないかもしれないので、おそらく言及する価値があるかもしれません、 'a = * c; 'の後でさえ、' a'と '* c'は引き続き2つの別個のオブジェクトです。 – hvd

関連する問題