1

C\C++ でロックレス キューを作成しています。キューは正常に動作していますが、エラーが発生します。Visual Studio はそれがフリー オペレーションであることを示し、この関数でクラッシュします。

extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer( const void * pUserData)

そして、これは、多くの読み取りスレッド (free を使用するスレッド) がある場合に発生します。free を削除すると、任意の数のスレッドで正常に動作するか、単純な printf("random stuff"); (明らかに少し遅くなります)スレッドの数に関係なく正常に動作します。だから私は何をすべきかわからない:(多くのスレッドがメモリウィンドウを解放しようとすると、それを処理できないように見えます。これが問題になる可能性がありますか?また、変数アドレスが「魔法」になると、アクセス違反が発生します(0xABABABAB、0xCDCDCDCD..)、これらもヒープに関連していることがわかりました..

Linux では、Posix スレッドには問題がなく、任意の数のスレッドで問題なく動作します。

では、なぜスレッドを遅くすると効果があるのか​​ (またはこれは偶然なのですか?)、速度を落とさずにヒープの問題を解決するにはどうすればよいのでしょうか? ヒープメモリに関するアドバイスは大歓迎です。

ソース: queue.c queue.h

4

1 に答える 1

1

MFC GUI から dll の 1 つを呼び出そうとしたときに、同様の問題に直面しました。

DLL の 1 つを静的リンクで作成し、他の DLL/EXE を MSVC ランタイムに対する動的リンクとして作成した場合、この種の問題が発生する可能性があります。

同じアプリケーションで使用されている場合でも、MSVC ランタイムに対して静的にリンクされた dll は、MSVC ランタイムに対して動的にリンクされた dll とは異なるコンテキストで実行されるようです。

基本的に、2 つの異なるコンテキストから作成されたポインターを解放または返すと、ヒープの破損が発生しました。VS でプログラムをデバッグすると、エラーは表示されません。ただし、実行すると、リターン コンテキストを終了した後にヒープ破損エラーが表示されます。

考えられる解決策の 1 つは、すべての dll を MSVC ランタイムに対して動的にリンクすることです。

お役に立てれば、

よろしく

于 2012-11-27T14:32:03.273 に答える