2012-05-06 131 views
0

ここでは、Delphiの無効なポインタ操作についての記事のほとんどを読みましたが、このケースには当てはまらないようです...試行錯誤は問題のある行に私を導きましたが、意味をなさない私。この例では、レコードの動的配列に解析されるテキストファイルの内容が格納されます。動的配列に割り当てられたメモリが解放された場合を除いて、すべてが完全に機能します。その場合、「無効なポインタ操作」を受け取ります。問題の行をifthen文から古典的なif-thenに変更すると、動作します。Delphi XEでのポインタ操作が無効です - IFTHENのため?

私の質問は簡単です:なぜ最初のものがメモリを解放するのに失敗しますが、もう1つは成功しますか?

第1の例:

TempFTDB[ci].FTText := ifthen(TempHolder = '', '', TempHolder + #13#10) + lr; 

実施例2:

if tempholder = '' then 
    TempFTDB[ci].FTText := lr 
else 
    TempFTDB[ci].FTText := tempholder + #13#10 + lr; 

メモリを解放ラインである:

TempFTDB := nil; 

さらに解明:TempFTDBローカル変数であり、ありますそれを解放する他の行はありません。エラーが発生するのは、 "TempFTDB:= nil"行にあります。あなたがメソッドのシグネチャで見ることができるようIfThen方法は、2つの文字列を期待しているため

+0

これを新しいプロジェクトに複製できますか? –

+1

どのようなタイプの 'TempFTDB'ですか? 'TempFTDB:= nil'行にエラーが発生した場合は、それに関連する' FTText'を何に設定していますか? – NGLN

+0

@NGLN - TempFTDBはレコードの配列です。 FTTextはレコードの短文フィールドです –

答えて

0

通常IfThenを使用してこの種の問題は次のとおりです。

function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string; 

あなたが投稿したコードが実際ある場合、私は知りません私は、 "偽"値が間違った状態にあると推測でき、IfThenメソッドはの両方の条件を常に実行します。の条件。

したがって、 "False"値でメソッドを渡す場合、このメソッドは実行するために条件がfalseであることに依存しますが、は常にが実行されるため、予期しない動作につながる可能性があります。

0

これは赤いニシンだったことが分かりました。上記のルーチン(上記のexcerpted)が2回目に実行されたときにエラーが返ってきました - 確かに割り当てられていないメモリのように聞こえる...上記のコードの直前に、レコードの一時的な配列の項目の番号を変更するルーチンがありました。問題...(恥ずかしい小さなミス...)

私が持っていた:

for i := 0 to length(FTDBFileBuffer_RTF) do 
    begin 
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber; 
    end; 

代わりの

for i := 0 to length(FTDBFileBuffer_RTF) - 1 do //notice the - 1 
    begin 
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber; 
    end; 

は、今の問題は... ただ学術的であるのはなぜ存在が希望またはab ifthenコマンドを実行するとエラーが表示されますか?

+0

割り当てられていないメモリ領域にレコードを書き込む場合のように、メモリが誤って上書きされると、エラーが不安定になります。 –

関連する問題