2010-12-04 23 views
4

クラスに文字列がある場合は、メモリが割り当てられます。デストラクタの文字列を破壊する必要がありますか?例えばC++の文字列を破棄する必要がありますか?

 
class A { 
    string Test; 
    A() { 
    Test = "hello world"; 
    } 

    A(string &name) { 
    Test = name; 
    } 

    ~A() { 
    // do I have to destroy the string here? 
    } 
} 

私は古いc/C++(pre stl)プログラマーで、C++に戻っています。文字列はテンプレートマジックを使って自動的に破壊されますか?

TIA、 デイブ

+1

あなたの例で 'string'は' :: std :: string'に解決されますか? – SingleNegationElimination

+0

興味深いもの(私にとっては)はデストラクタにあります。 C++は、親オブジェクトのコンストラクタが呼び出された後にメンバオブジェクトが破棄されることを保証しますか?どういうわけかこれが起こらないようにすることはできますか? (ちょうど好奇心から離れて、多分あなたはC++標準の関連セクションを引用することができます) –

+0

C++は、あなたのクラスメンバが構築されたのと反対の順序(宣言された順序)で破棄されることを保証します。 C++標準よりも読みやすい説明:http://msdn.microsoft.com/en-us/library/8183zf3x(VS.80).aspx – cgmb

答えて

5

はい。文字列とコンテナはあなたのために割り当て/割り当てを解除します。しかし、ポインタのコンテナは、ポインタが指しているものを解放しません。あなたはそれらを自分でループする必要があります。

+0

それはスタックとヒープの違いです。 +1 – jwueller

+0

おかげで、あなたはコンテナについて私の次のクエストを先取りしました。コンテナを自動的に解放するようにコンテナを設定する方法はありますか?例えばDelphi(ここから移動しています)では、リストにOwnsObjectフラグを設定すると、自動的に含まれているオブジェクトが破棄されます。 – daven11

+0

スマートポインタを見てみるといいかもしれません。基本的には、ポインタの機能をエミュレートするオブジェクトであり、スコープを離れると自動的に削除されます。 http://en.wikipedia.org/wiki/Smart_pointer – AndyPerfect

2

いいえ文字列のデストラクタは、Aのインスタンスがスコープ外になると呼び出されます。

2

文字列へのポインタを作成していないので、Testはスタックに割り当てられます(オブジェクトAがスタックに割り当てられていると仮定します)。したがって、スコープを離れると、自動的に割り当てが解除されます。 Testがポインタであれば、ヒープに割り当てられ、デストラクタで削除する必要があります

+1

「テスト」がスタック上にあることはわかりません。しかし、そうでなければあなたは正しいです。 – Detmar

+0

何らかの理由で、クラス全体がヒープに割り当てられている可能性があります。この場合、テストはヒープに関係なく行われます。 – AndyPerfect

0

あなたは混乱を取り除き、標準ライブラリはその混乱を取り除きます。 std :: stringが割り当てるメモリは混乱しています。

デストラクタのデフォルトの動作は、各ベースとデータメンバでデストラクタを呼び出すことです。あなたの文字列はデータメンバなので、そのデストラクタが呼び出されます。そのデストラクタはここで行う必要があるすべてを行います。したがって、main()のローカル変数として文字列がある場合よりも、ここで何かをクリーンアップする必要はありません(実際は間違いでしょう)。

関連する問題