0

数年前に書いたコードがあります。正常に動作していますが、他の場所にある新しい無関係のコードを使用して最近再構築した後、動作しなくなりました。これはコードです:

//myobject.h
...
inline  CMapStringToOb* GetMap(void)    {return (m_lpcMap);};
...

上記は次のようにメインアプリからアクセスされます:

//otherclass.cpp
...
CMapStringToOb* lpcMap = static_cast<CMyObject*>(m_lpcBaseClass)->GetMap();
...

私が言ったように、これは長い間機能していましたが、最新のビルドの時点で失敗し始めることが決定されました。これをデバッグしましたが、ポインタが設定されているコードで、メモリアドレスが実際の値に正しく設定されていることがわかります。set関数にステップインし、メモリアドレスを書き留めてから、この関数に移動し、0xfdfdfdfdを取得してから、デバッガーで手動でメモリアドレスを取得することもできました。これにより、コードが機能します。さて、私が読んだことから、0xfdfdfdfdはバイトを保護すること、または「人の土地がない」ことを意味しますが、それが何を意味するのかはよくわかりません。おそらく、それは1つのエラーによるオフも意味しますが、コードが以前に機能していた場合、それがどのように発生する可能性があるのか​​わかりません。

4

3 に答える 3

5

ハンガリー語の表記から、Visual Studio を使用していると思います。マップ ポインターを保持するアドレスはわかっているので、デバッガーでプログラムを開始し、そのマップ ポインターが変更されたときにデータ ブレークポイントを設定します (マップが指されているのではなく、マップ ポインターを保持しているメモリ)。次に、いつ上書きされるかを正確に知ることができます。

于 2012-01-27T16:54:32.507 に答える
3

0xfdfdfdfd通常、想定されていないメモリにアクセスしたことを意味します。

  • メモリが割り当てられ、その後解放された可能性が十分にあります。したがって、解放されたメモリを使用しています。
  • static_castはポインターを変更でき、 への明示的なキャストと へCMyObjectの暗黙的なキャストがありCMapStringToObます。から直接返されたポインタの有効性を確認しますGetMap()
于 2012-01-27T16:59:27.637 に答える
2

「魔法」が発生するシナリオでは、ほとんどの場合、メモリ破損が発生します。コードのどこかでメモリを誤って変更したため、この奇妙な動作が発生したと思われます。コードのこの部分を入力するいくつかの異なる方法をテストしてみてください。行動は一貫していますか?

これは、正しくビルドされていないバイナリが原因である可能性もあります。プロジェクトをクリーンアップして再構築してみてください。

于 2012-01-27T16:54:42.697 に答える