2017-08-16 5 views
0

私には以下のコードがあります。私はV(5,0)を呼び出し、2行目でVに割り当てたときにC++の静的型オブジェクトに新しいオブジェクトを再割り当てする

f() 
{ 
    static V v(10,0);//first argument is size and the second is init val for each element 
    ... 
    v = V(5,0); 
} 

以前に自動的に破棄されますV(10,0)が割り当てられていますか?それとも破壊する必要がありますか?

vは静的であるため、オブジェクトV(5,0)は関数呼び出しで保持されていますか?

+1

割り当ての仕組み、および***コピー*** - 代入演算子 'operator ='についてのいくつかの研究はうまくいくかもしれません。 –

答えて

1

V(5,0)を呼び出して2番目の行のvに割り当てると、以前に割り当てられたV(10,0)は自動的に破棄されますか?それとも破壊する必要がありますか?

いいえ。このオブジェクトは、アプリケーションの有効期間中存続します。その状態は割り当て操作によって変更されます。

オブジェクトは、アプリケーションが終了すると自動的に破棄されます。あなたはそれを破壊する必要はありません。それを破壊しようとすると、プログラムは未定義の動作をします。あなたは、コードと議論がより有意義にするためにvVより良い名前を使用することができます


PS。

+0

Vのコンストラクタが動的メモリ割り当てを実行している場合、先に割り当てられたメモリをクリアするために、まずデストラクタを明示的に呼び出すことによってそのメモリを解放する必要があります。次にVを再度呼び出すと、コンストラクタは動的メモリ割り当てを再度実行します。 – marc

+0

@marc、デストラクタを呼び出すのは良い考えではありません。オブジェクトのデータのメモリの割り当てを解除して再割り当てする必要がありますが、代入演算子でオブジェクト自体のデストラクタを呼び出さないようにする必要があります。 [コピーとスワップイディオム](https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)を見てみてください。 –

+0

デストラクタを呼び出してから、代入操作でコンストラクタを呼び出します。コンストラクタは動的なメモリ割り当てを行うので、V(10,0)にコートされたメモリを解放できるように、解放する必要があります。それは正しいと思いますか? – marc

関連する問題