CStringArrayの配列を動的確保して解放するには?

解決


なちゅら  2009-11-05 13:53:23  No: 71053  IP: [192.*.*.*]

はじめまして。
VC++6.0(SP6適用)、MFC  ダイアログベースで開発しています。

aaaaaa
bbb
ccccccccccc
・・・
といった、行数も1行の文字数もばらばらな文字列をファイルから読み込んで
表示する、というプログラムを作ろうとしています。

CStringArray *result_array = new CStringArray[n];    //CStringArrayの配列を動的確保
-----result_arrayにデータを追加して表示-----
delete [] result_array;     //解放

nは配列の要素数で、値は現在10(テスト段階なので少なめ)を格納してあります。
他部分のプログラムはあまり影響無いようだったので省略しました。

これを実行すると「ブレークポイントの設定位置  ○○(アドレス)」と出て
混合モードの画面が出た状態で処理がとまります。
int 3の所でとまっており、調べた所配列の要素数を超えてアクセスしている
ようです。
1ステップずつ実行してみるとdeleteに問題がある様子。
しかし、正しい解放の仕方が分かりません・・・。
そもそもこのresult_arrayの宣言自体、正しいのか自信が無いです。
newを使っているのでdeleteする必要はありますよね?

どうすれば良いのでしょうか。
(足りない情報がありましたらご指摘ください)
よろしくお願い致します。

編集 削除
仲澤@失業者  2009-11-05 14:12:00  No: 71054  IP: [192.*.*.*]

>CStringArray *result_array = new CStringArray[n];    //CStringArrayの配列を動的確保

が大間違いです。C++の基本をしっかりと勉強し、
また、MFCのマニュアルを良く読みましょう。
CStringArrayはクラスです。それ単体で動作します。

CStringArray    StrAry; // 文字列の配列を構築
StrAry.Add( _T("最初の文字列"));
StrAry.Add( _T("次の文字列"));

の様に使います。

編集 削除
なちゅら  2009-11-05 15:32:19  No: 71055  IP: [192.*.*.*]

ありがとうございます。
やはり宣言からして違いましたか・・・

ファイル内のデータが
aaaaaaa
bbb
ccccccc

dddd
eeeeeee

とある時aaaaaaa〜cccccccを1つのCStringArrayに、
dddd・eeeeeeeを別のCStringArrayに格納したいのです。
2つ3つなら地道に
CStringArray    StrAry1;
CStringArray    StrAry2;
CStringArray    StrAry3;
とすることもできますが、ファイルを読み込むまでいくつになるか分かりません。
CStringArrayをコンテナ等で更に配列にすれば良いのでしょうか・・・

編集 削除
επιστημη  URL  2009-11-05 16:05:06  No: 71056  IP: [192.*.*.*]

> CStringArrayをコンテナ等で更に配列にすれば良いのでしょうか・・・

正解。とはいえ配列の要素数はあらかじめわかんないっしょ。
CStringArrayの可変長配列をこしらえればいんじゃないすか?

編集 削除
ryo  2009-11-05 16:18:38  No: 71057  IP: [192.*.*.*]

文字列を動的な配列で扱うだけではなく
「CStringArray」そのものも動的に扱うというなら、間違ってない

ので、
1:new〜delete[]までの間をすべてコメントアウトして、newとdeleteだけで正常に動くかためす
2:内容を少しずつコメント解除しながら試し、どこに原因があるか探る

それでもわからない場合は、今回省略して提示してない部分をあげてみてください

以下参考**************
  CStringArray *strarray = new CStringArray[ 2 ];

  strarray[0].Add("Test");
  strarray[0].Add("NEXT");
  
  strarray[1].Add("Test");
  strarray[1].Add("NEXT");

  delete [] strarray;

#VC6で動作確認

編集 削除
なちゅら  2009-11-05 16:36:57  No: 71058  IP: [192.*.*.*]

>επιστημηさん
CStringArrayの可変長配列、頑張って調べてみます。

>ryoさん
現在私が書いているソースもryoさんの参考とほぼ同じなのに
1.の段階でブレークポイントになりました。
試しに、参考をそのまま貼り付けてやってみても同じ・・・だったのですが、
リビルドするとちゃんと動きました・・・。
私が本来書いていたソースでも正常です。

ひとまず解決にしたいと思います。お騒がせしました・・・
根本的によく分かっていない所も多いので、きちんと勉強していきたいと思います。

仲澤@失業者さん、επιστημηさん、ryoさん、
ありがとうございました。

編集 削除
επιστημη  URL  2009-11-05 17:06:44  No: 71059  IP: [192.*.*.*]

> CStringArrayの可変長配列、頑張って調べてみます。

いらんことしぃ ^^;

#include <iostream>
#include <afx.h>
#include <afxtempl.h>

int main() {
  CArray<CStringArray*,CStringArray*> saa; // CStringArrayのArray

  // いくつかつっこんで
  CStringArray* sa;
  sa = new CStringArray();
  sa->Add("0-0");
  sa->Add("0-1");
  saa.Add(sa);
  sa = new CStringArray();
  sa->Add("1-0");
  sa->Add("1-1");
  sa->Add("1-2");
  saa.Add(sa);

  // よみだすなり
  for ( int i = 0; i < saa.GetCount(); ++i ) {
    CStringArray* pa = saa[i];
    for ( int j = 0; j < pa->GetCount(); ++j ) {
      std::cout << static_cast<const char*>((*pa)[j]) << std::endl;
    }
    delete pa; // ついでに廃棄
    std::cout << std::endl;
  }
}

編集 削除
なちゅら  2009-11-05 17:37:25  No: 71060  IP: [192.*.*.*]

>επιστημηさん
ご丁寧にありがとうございます(笑
せっかくなので、時間ができたらこの方法もじっくり考えてみようと思います。
また、もし再度CStringArray辺りで問題発生したり、
今のソースで対処しきれなかったりして調べても分からなかったら
参考にさせていただきますね。

編集 削除