• ベストアンサー

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; // ----- で、良いのでしょうか? それとも、他の書き方が必要なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#15436
noname#15436
回答No.1

それで良いです。 Test_t をクラスにして,配下のメモリ確保/解放を任せるという手もあります。蛇足かも。

Trick--x--
質問者

お礼

その方法がありましたね。 C++は始めたばかりなので失念していました^^;

その他の回答 (1)

  • nk2
  • ベストアンサー率23% (6/26)
回答No.2

その方法で結構です。 しかし、折角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[]は忘れればメモリリークです。要素数を間違えればエラーになります。

Trick--x--
質問者

お礼

回答ありがとうございます。 > 構造体メンバの配列の要素数、10を把握してなくてはなりません。 要素数は他の箇所でも使うので持っています。 教えていただいた方法は今後の参考にさせていただきます。

関連するQ&A