0

無効な this ポインターを格納するオブジェクト メソッドが原因で、クラッシュすることがある C++ でアプリケーションを作成しました。アプリケーションをデバッグしてコールスタックを見ると、関数func1があり、次はfunc2です。最初の関数ではポインターは有効ですが、2 番目の関数では、this ポインターが最初の関数のポインターと同じアドレスを持つ必要がありますが、this ポインターは無効なメモリ アドレスを指しています。

void obj1::func1( obj2* o ){
  //Pointer o is valid and correctely initialized when i debug my Application
  o->func2();
}

void obj2::func2(){
  //Here i do a call on the this pointer. The this pointer is invalid and so my
  //Application is crashing. How can i have a different this pointer then the 
  //pointer i was calling on. I can't imagine how this can happen.
  this->someCall();
}

私のアプリケーションは別のスレッドを使用しているので、動作していない他のスレッドでオブジェクトを削除する可能性があると考えていましたが、このポインターは変更されません。間違っている場合は教えてください。このエラーがどのように発生するかわかりません。

ご協力いただきありがとうございます。デニス

4

2 に答える 2

1

あなたが提供した方法でコードに問題はありません。しかし、答えはあなたの質問にあると思います。あなたは複数のスレッドを使用しています。複数のスレッドを作成したら、スレッド モデルと、メモリへのアクセスがどのように同期されるかを確認する必要があります。残念ながら、問題はこの特定のコードの記述方法に関連していないように見えるため、正確に何が起こるかを判断するのはあなた次第です。

于 2012-09-01T22:52:38.580 に答える
0

この問題はマルチスレッドの問題が原因のようです。

コンピューターは、行 A と行 B の間に短い休憩を取り、「o」が指すオブジェクトを削除する可能性があります。

void obj1::func1( obj2* o ){
  o->func2(); //Line A
}

void obj2::func2(){
  this->someCall(); //Line B
}

オブジェクトを (明示的または暗黙的に) 分解するコード内のすべての場所を特定し、オブジェクトがまだ指されている間はオブジェクトを削除できないようにする必要があります。

スマート ポインターを使用するか、オブジェクトの操作をロックと同期するだけで、これを強制できます。

于 2012-09-01T23:19:26.480 に答える