こんにちわ、いつもお世話になっています。
早速ですけど、質問させていただきます。
環境はVC++6.0使用。
以下の現象は同じPCのみ発生します。
・変数に Cnt を使用し、その変数を処理する時。
・ベクタのsize()をクィックウォッチないで表示する時。
・作成した関数の初めにコードが記載している行にブレークポイントを張り、
その関数を処理する時
現在までに上記のタイミングでエラー(Access Violation)が発生します。
何が原因なのか、検討しようがない状態です。
どんなことでもいいのでアドバイスしていただけませんか?
よろしくお願いします。
これだけの話では何とも言いかねますが、
同じものを複数のPC上で実行して特定のPCでのみ起こると言うのであれば、
実行ファイルもしくはDLLが壊れている。
実行ファイルがリンク対象としたDLLと違うバージョンのDLLがロードされて実行されている。
というのがぱっと思いつく内容ですね。
ただ、実行環境の違いがPCの違いだけでなくOSの種類も含むのであれば、
OSによる処理の切り分けの必要があるのに同じ処理で動作させているとかもありえると思
います。
Access Violationが起こっているところが直接の原因とは限りませんし、
全く別の所でメモリ内容を破壊した結果、Access Violationが起こっているかもしれません。
今あげている範囲の内容だけに着目しても突破口は見出せないと思います。
PATIOさんお返事ありがとうございます。
>>実行ファイルもしくはDLLが壊れている。
そうなんですか・・・DLLまで考えていませんでした。
実は一度ディスクのフォーマットも行ったのですが、
一向にエラーは回避できませんでした。
OSも2000からXPへと変更しました。
DLLによるVC++の影響を考察してみます。
>>OSによる処理の切り分けの必要
詳しくは分かりませんが、その可能性も十分ありそうですね・・・。
また、ウィンドウズのディスクエラーチェックも行いますと、
エラー回数が幾分か減っているような気がします。。。
ディスク一部の欠損が原因なのではとも思ってきました・・・。
まったく謎です・・・。
あと一言追加するなら、
メモリ破壊を起こしているような状態の場合、どんな不可思議な状況にもなりえると言う
ことです。
見た目だけの挙動を見ただけでは全く見当も付かないような動きをする事があります。
一度破壊されてしまうとどんな事も起こりうるくらいに考えていた方が良いと思います。
追伸、PATIOさんありがとうございます。
自分は初心者ですのでメモリーリンク等も兼ねて
十分考察しながら検討していこうと思います。
>また、ウィンドウズのディスクエラーチェックも行いますと、
>エラー回数が幾分か減っているような気がします。。。
外してるかもしれないですが、HDDが寿命ということはないでしょうか??
> 実は一度ディスクのフォーマットも行ったのですが、
> 一向にエラーは回避できませんでした。
> OSも2000からXPへと変更しました。
OSなどもクリーンインストールした状態で発生しているのなら、
トンプソンのソースがあやしいと思うのですが。
> ・変数に Cnt を使用し、その変数を処理する時。
> ・作成した関数の初めにコードが記載している行にブレークポイントを張り、
> その関数を処理する時
これらなどは、どのようなソースか分かりませんが、メモリオーバーフロー、スタックオーバー
フローなどを発生させれば、
Access Violationなどは簡単に発生しそうですが。
特に、ポインタ変数などなら、その値が書き換えられた状態で、そのポインタにアクセスすれ
ば、
大抵はメモリアクセスエラーなどが発生します。
あとポインタ変数を宣言したが、そのポインタの指す変数(など)を指定しないまま、
そのポインタ変数を用いたポインタアクセスをしたとか。。。
例)
int *pint;
*pint = 1;
初心者と言うことなのでKING・王さんの指摘が当たっているかもしれませんね。
そうだとすると比較的初歩的なミスと言うことになります。
> OSなどもクリーンインストールした状態で発生しているのなら、
> トンプソンのソースがあやしいと思うのですが。
トンプソンさん、すいません。
呼び捨てになっていました。
> そうだとすると比較的初歩的なミスと言うことになります。
はい。でもこの手のミスは、知らないうちに変数の値を書き換えられたりするので、
結構はまったりすることがありますよね。
問題が発生する(落ちる)場所と、その原因となる場所が別の場所であるような場合は、
そのことに気づかなかったりしますので。。。
PATIOさん、KING・王さん、nさんお返事ありがとうございます。
>>これらなどは、どのようなソースか分かりませんが、
>>メモリオーバーフロー、スタックオーバーフローなどを発生させれば、
>>Access Violationなどは簡単に発生しそうですが。
そのようなAccess Violationでしたら、まだ自分で解決出来そうです・・・。
時々、エラー起こしちゃいますけど(笑)
今回のAccess Violationは
例1)
for(int Cnt = 0 ; Cnt < 10 ; Cnt++) //←エラー発生
for(int cnt = 0 ; cnt < 10 ; cnt++) //正常
例2)
BOOL XXXXXXXX::OnSetActive()
{
int num = 0 ;//←エラー発生
・
・
・
}
など、予想外なパターンで発生するので・・・。
エラー発生したPCでビルドを行ったプロジェクトを他PCにて動作確認を行うと、
正常に動作しますし・・・。
ただ、PATIOさんが教えてくれたどんな不可思議な事にもなるうる事を
考慮すると、上記の処理以前にKING・王さんのようなメモリ破壊が行われて
何らかのメッセージによってメモリ破壊のエラーが表面化するといったパターンかもしれ
ません。
最近は以前よりエラーが少なくなりなしたが
いつ起きるか分からないので
初歩的なデータの受け渡しに十分注意していこうと思います。
ありがとうございました!