プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (2件)

それで良いです。



Test_t をクラスにして,配下のメモリ確保/解放を任せるという手もあります。蛇足かも。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/11 08:35

その方法で結構です。


しかし、折角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[]は忘れればメモリリークです。要素数を間違えればエラーになります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/11 08:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています