動的配列で例外・・?なぜ?

解決


マロ  2005-06-28 21:29:32  No: 15968

ちょっと長いのですが、ご教授頂けたら幸いです。

type
  PTInfo = ^TInfo
  TInfo = record
  Num: Integer;
  Dat: TMemoryStream;
end;

type
  TInfoAry = array of TInfo;

メンバ変数で

FInfoAry :TInfoAry;

として動的配列を利用しています。

配列を増やすときは、SetLengthを使っています。

仮に、この動的配列が100個できたとします。
(FInfoAry[0]〜FInfoAry[99])

それぞれのNumには0〜99の整数値が入っています。
MemoryStreamも、配列を増やした後、生成し、
Datには何らかのデータが入っているとします。

ちなみに、実行してデータを格納し、アプリケーションを終了しても、正常終了するので
メモリリークはないようです。(MemCheck.pasというのを利用しています)

ここまでうまくできたようなので、それぞれのデータNum、Datを、ファイルに出力
しようと思い、NumはTStringListのSaveToFile、DatはTMemoryStreamのSaveToFile
を利用し、ファイルに出力してみました。

for文で配列[0]から順に出力しているのですが、[6]番目を出力しようとすると例外(access violation)が発生します。
GetLastErrorでエラーを見ると、「この操作を正しく終了しました」と言われています。
以下のコメントの所(TMemoryStream)のデバッグをするときは、TStringListの方をコメントにしています。
どちらでも同じ例外が発生します。

try
  nLen := Length(FInfoAry);
  for i:=0 to nLen-1 do begin
    sList := TStringList.Create;
    sFname := 'out_num' + IntToStr(i) + '.txt';
    sList.Add('NUM : ' + IntToStr(FInfoAry[i].Num));
    sList.SaveToFile('C:\test\' + sFname);
    sList.Free;
  end;

//  for i:=0 to nLen-1 do begin
//    sFname := 'out_dat' + IntToStr(i) + '.txt';
//    FInfoAry[i].Dat.SaveToFile('C:\test\' + sFname);
//  end;
except
  GetLastErrorStr(GetLastError);
end;

データが正常に格納されていないのかと思い、[0]からではなく[5]番目あたりから出力してみたのですが、
[5]〜[11]までは正常に出力するのですが、[12]番目を出力しようとすると上記と同じような例外が発生します。
データは正常に格納されているように見えるので、何がいけないのかサッパリわかりません。

SetLengthの使い方がマズイのでしょうか?
FIdx:Integer
FIdx := 0;
----------------------
SetLength(FInfoAry, FIdx+1);
FInfoAry[FIdx].Dat := TMemoryStream.Create;
Inc(FIdx);
という感じで使っているのですが・・。


マロ  2005-06-28 22:45:56  No: 15969

すみません、自己解決しました。
PCを再起動したら問題なく動作するようになりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加