ちょっと長いのですが、ご教授頂けたら幸いです。
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);
という感じで使っているのですが・・。
すみません、自己解決しました。
PCを再起動したら問題なく動作するようになりました。
ツイート | ![]() |