• ベストアンサー

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

  • VC++2005MFC 入れ子構造体の使い方

    VC++2005MFC typedef struct TMago{ stTestData mdata1[1000]; }stMago; typedef struct TKo{ stTestData kdata1[10000]; stTestData kdata2[10000]; stTestData kdata3[10000]; stTestData kdata4[10000]; stTestData kdata5[10000]; stMago *pMago[10000]; }stKo; typedef struct TOya{ stTestData odata1[100]; stTestData odata2[100]; stKo *pKo[100]; }stOya; stOya m_stOya;//メンバ変数 という構造体が定義されているのですが、 【Q1】 pMago、pKoのそれぞれ指定した分のメモリ確保は 例)それぞれ10個と20個分メモリ確保したい場合 for(int i = 0; i < 10; i++) { m_stOya.pKo[i] = new TOya; } とした後、 for(int i = 0; i < 10;i++) { for(int j = 0; j < 20; j++) { m_stOya.pKo[i]->pMago[j] = new TMago; } } で良いでしょうか? 【Q2】 また、これを解放するには、 同じループ処理を今度は内側から for(int i = 0; i < 10;i++) { for(int j = 0; j < 20; j++) { Delete m_stOya.pKo[i]->pMago[j]; } } for(int i = 0; i < 10; i++) { Delete m_stOya.pKo[i]; } で良いでしょうか? 【Q3】 pMago[0]の内容をpMago[1]へコピーしたい場合は memcpy(m_stOya.pKo[0]->pMago[1], m_stOya.pKo[0]->pMago[0], sizeof(TMago)); で良いでしょうか? 使い方なんてCの基本だろーですとか、そもそもこんな作りの構造体やめれば? と思われることは重々承知ですが、ご教授お願いいたしますm(__)m

  • C++でCの構造体をnewするとまずいのでしょうか?

    以下のようなCで書かれたヘッダがあったとして ---testc.h--- typedef struct __Test { int i; char c[30]; char* x; } Test; これを以下のようにnewして使うのは問題ないでしょうか? ---test.cpp--- extern "C" { #include test.h } int main(void) { Test* test = new Test(); test->i = 30; test->c[3] = 'a'; test->x = "aiueo"; return 0; }

  • 構造体メンバ 構造体ポインタ 値代入

    typedef struct _test_t{ int aaa; int bbb; } test_t; typedef struct _globalData{ int xxx; test_t* pTestData[256]; } globalData_t; globalData_t globalData; int main(){ test_t testData1 = {1,1}; test_t testData2 = {2,2}; *globalData.pTestData[1] = testData1; /* (1) */ globalData.pTestData[2] = &testData1; /* (2) */ } 上記のようなグローバルデータの構造体globalData のメンバの構造体配列にtest_t型の構造体を格納し保持するには、 (1)、(2)のどちらが正しいでしょうか?

  • 入れ子になった構造体について

    以下のように定義した、2重に入れ子になった構造体があります。 これを、mallocを使ってエリアを確保した後、初期化しています。 例では、各構造体の項目数が少ないのですが、 項目が増えた場合、下記のような初期化方法だと面倒だと思います。 もっとよい方法があるのだろうと思っているのですが・・・。 下記は私の試行錯誤結果なので、「普通はこうやるんじゃないの?」という方法などがあればご教授願います。 /* -- 構造体定義 -- */ typedef struct {   char data[16] ; }D_TAG ; typedef struct {   char name[16];   D_TAG *d ; }F_TAG ; typedef struct {   char name[16] ;   F_TAG *f ; }T_TAG ; /* -- 変数定義 -- */ T_TAG *t ; /* -- エリア確保 -- */ t=(T_TAG*)malloc(sizeof(T_TAG)*10); for(i=0;i<10;i++) {   t[i].f=(F_TAG*)malloc(sizeof(F_TAG)*10);   for(j=0;j<10;j++) {     t[i].f[j].d = (D_TAG*)malloc(sizeof(D_TAG)*10);   } } /* -- 初期化 -- */ for(i=0;i<10;i++) {   memset(t[i].name , 0x00, sizeof(t[i].name));   for(j=0;j<10;j++) {     memset( t[i].f[j].d, 0x00, sizeof(D_TAG)*10);     memset( t[i].f[j].name , 0x00, sizeof(t[i].f[j].name));   } } よろしくお願いいたします。

  • 構造体の入れ子が構造体の場合のextern宣言について

    えーと、題名の通りで、単に構造体の場合はextern出来たのですが、構造体の入れ子が構造体の場合は上手くextern出来ないのです;;; typedef struct __test001 { int arg; } _test001; typedef struct _body { _test001 test001; } body; body useful; この場合、他のファイル(例えばtest.cpp)でusefulを使いたい場合、どのようにexternさせれば宜しいでしょうか?

  • 入れ子の構造体について

    例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?

  • .NET C++で、構造体の配列をnewで作成しようとするとerror C2440のエラーとなってしまいます

    Visual studio2003 .NET C++で、構造体の配列を作成し、 改めて構造体の配列をサイズ指定して作成しようとすると、error C2440が出てしまいます。 ポインターで宣言したつもりはないのですが、ポインターから配列に変換できないといった項目のエラーなので、 なぜこのようなエラーが出るのかわからずにおります。 typedef __nogc struct TEST { // 省略 }; TEST struct_test __nogc[]; int int_num = 10; struct_test = new TEST __nogc[int_num]; // error C2440: '=' : 'TEST *' から 'TEST []' に変換できません。 ご指摘等ありましたらご回答いただけますと助かります。 よろしくお願いいたします。

  • 構造体の構造体配列初期化

    typedef strunct _test01 { int a; int b; } test01_t; typedef strunct _test { int c; test01_t sTest01[256]; } test_t; test_t sTest; 上記のような構造体がある場合、sTestのメンバのsTest01をNULL初期化する 方法とsTest01に値が入っていないか(初期化されているか)を判定する方法を 教えていただけませんか? よろしくお願い致します。

  • 構造体型のポインタ変数を含む構造体

    struct seiseki_tag { Int32 math ; Int32 english ; Int32 science; } ; typedef struct seiseki_tag SEISEKI ; struct personal_tag { Char name ; Int32 num ; SEISEKI *sptr } : typedef struct personal_tag PERSONAL ; struct info_tag { PERSONAL person_info ; } ; typedef struct info_tag INFO ; たとえば、上記のように3つの構造体があり、PERSONAL構造体のメンバーに SEISEKI構造体の型を持つポインタ変数が含まれているような場合で、下記のように INFO型のポインタ変数からSEISEKI構造体のメンバーを参照する方法を教えてください。 PERSONAL構造体メンバーのnameやnumは INFO *info ; info->person_info.name ; info->person_info.num ; のように参照すると思いますが、sptrが示すSEISEKI構造体のメンバーへの アクセスができません。下記のように参照を試みたのですがコンパイルは 通るのですが、実際に参照できていませんでした。 INFO *info ; SEISEKI *seiseki ; seiseki = info->person_info.sptr ; seiseki->math ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

  • C++ 構造体のnew

    こんにちは C++のプログラムで 構造体 KOUZOUTAIの領域をx個分確保したいと思っています。 構造体のメンバにはポインタは使われていません。 KOUZOUTAI *kouzoutai1; int count = 5; kouzoutai1 = new KOUZOUTAI[count]; delete[] kouzoutai1; CLASSを使用していませんが、問題ないでしょうか?

専門家に質問してみよう