10

これは世界で最も単純なことのように思えます、そして私はそれの上に私の髪を引っ張る準備ができています。

私はこのようなユニットを持っています;

Unit  myUnit;
// ...
//normal declarations
//...
Public
//bunch of procedures including
Procedure myProcedure;

const
//bunch of constants

var
//bunch of vars including
myCounter:integer;

Implementation
Uses //(all my uses)

// All of my procedures including

Procedure myProcedure;
   try
     // load items from file to TListBox - this all works
   except
   on EReadError do begin
     // handle exception
     end;
   end; //try



   myCounter:=0;  //  <--  ACCESS VIOLATION HERE
   while myCounter //...etc

これは変数の単純な割り当てであり、なぜこれを行っているのかわかりません。ユニットに対して、プロシージャに対して、グローバルに変数を宣言しようとしました-どこで実行しようとしても、アクセスをスローせずに、このプロシージャ内のどこでも宣言された整数にゼロの値を割り当てることはできません違反。私は完全に困惑しています。

同じユニット内からボタンOnClickハンドラー内からプロシージャを呼び出していますが、どこから呼び出しても例外がスローされます。クレイジーなことは、プログラム全体のユニット内の他の12の場所で、まったく同じことを問題なく実行できることです。なぜここに?私は完全に途方に暮れています。

4

5 に答える 5

10

Read of address 00000008nilポインターから8バイトのオフセットで変数を読み取っていることを意味します。これは、ここで実行しようとしていることとはまったく一致しません。これは、読み取りではなく書き込みを行っており、どこかから読み取られた変数ではなく定数を書き込んでいるためです。

これが例外をトリガーしている実際の行であると確信していますか?この行にブレークポイントを設定しましたか?この行を手順の先頭に移動してみましたか?

実際のコードが目の前にないことを確認するのは難しいですが、推測しなければならない場合、これより前の行が例外を引き起こしていると言えます。その後、命令ポインターがすでにインクリメントされているため、Delphiは次の行を強調表示します。

于 2010-04-27T17:36:44.387 に答える
2

私はあなたのエラーがそれが見えるもののようなものを意味するとは思わない。このようなコードからアクセス違反が発生し、アクセス違反を発生させる適切な方法がない場合は、何らかの方法でゴミ箱に入れられたメモリを見ていることになります。

CPUウィンドウで問題のあるコードをステップ実行し、実際に何が起こっているかを確認します。

于 2010-04-27T17:09:18.627 に答える
1

ステートメントで使用していて、別のmyCounterを見ていますか?

コードの一部がメモリに書き込んでいるか、すべきではないのに解放していて、誤ってその特定のローカル変数にアクセスしたときにAVが発生しますか?

于 2010-04-27T17:10:49.050 に答える
1

アクセス違反をスローする割り当てmyCounter:= 0は、グローバル変数が格納されているデータセグメントがメモリから削除されたか、レジスタがmyProcedureルーチンに接続されていることを示します。

CPUビューを使用して、グローバル変数にアクセスするために使用されているレジスタを確認し、そこから逆方向に作業して、そのレジスタ/それらのレジスタがどこで問題が発生するかを確認します。

于 2010-04-27T17:11:34.287 に答える
0

MyCounterを変数リストの一番上に移動し、それがまだ発生するかどうかを確認します。問題が解決した場合は、現在問題が発生している上記の変数を確認してください。境界を超えて成長している配列など、興味深いものが見つかる可能性があります。

于 2010-04-27T17:08:07.203 に答える