- ベストアンサー
C++:構造体:newで入れ子:deleteは?
C++で以下のような構造体を使っています。(本当は他にもメンバが有ります) // ----- typedef struct{ int *npMember; }Test_t; // ----- これをクラスのメンバ変数で // ----- Test_t *m_tpTestStruct; // ----- とし、関数の中で // ----- m_tpTestStruct = new Test_t[10]; for (int i = 0; i < 10; i++) { m_tpTestStruct[i].npMember = new int[100]; } // ----- というようにメモリを割り当てています。 これを解放する時は、 // ----- for (int i = 0; i < 10; i++) { delete [] m_tpTestStruct[i].npMember; } delete [] m_tpTestStruct; // ----- で、良いのでしょうか? それとも、他の書き方が必要なのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
それで良いです。 Test_t をクラスにして,配下のメモリ確保/解放を任せるという手もあります。蛇足かも。
その他の回答 (1)
- nk2
- ベストアンサー率23% (6/26)
その方法で結構です。 しかし、折角C++を使っているのですからメンバを隠蔽しましょう。 クラスのデストラクタでdelete[] npMemberを呼び出します。 //---------------------------------------------------------- class Test_t{ int* npMember; public: Test_t(int lenght) { npMember = new int[lenght]; } ~Test_t() { delete[] npMember; } }; //---------------------------------------------------------- Test_t* m_tpTestStruct = new Test_t[10]; for (int i = 0; i < 10; i++) { m_tpTestStruct[i] = Test_t(100); } //---------------------------------------------------------- delete[] m_tpTestStruct; //---------------------------------------------------------- for (int i = 0; i < 10; i++) { delete [] m_tpTestStruct[i].npMember; } という方法は構造体メンバの配列の要素数、10を把握してなくてはなりません。 メンバに配列の要素数を加えるやり方はメモリの無駄ですし、メンバ配列の数が増えると管理し切れません。 しかもメンバ配列のdelete[]は忘れればメモリリークです。要素数を間違えればエラーになります。
お礼
回答ありがとうございます。 > 構造体メンバの配列の要素数、10を把握してなくてはなりません。 要素数は他の箇所でも使うので持っています。 教えていただいた方法は今後の参考にさせていただきます。
お礼
その方法がありましたね。 C++は始めたばかりなので失念していました^^;