私は明らかにパーティーに非常に遅れていますが、いくつかの光を当てるために、この問題に関する私の経験を共有すると思いました.
私は現在、Windows API 機能をラップする軽量のウィンドウ ライブラリを開発しています。
最上位の Window クラスの宣言には、WNDCLASSEX クラス名と対応するウィンドウのタイトルの両方を表す CHAR 配列のベース アドレスへのポインターが含まれています。この文字列はヒープに割り当てられ、たとえば Window オブジェクトが破棄されたときに NULL クラス名を登録解除しないように、常に Window のコンストラクターにコピーされます。Window のデストラクタは、CHAR バッファで delete[] も呼び出します。
問題が最初に発生したのは、1 つ以上の Window (または派生クラス) インスタンスで使用する独立したメッセージ処理関数の実装を開始したときです。ループは次のとおりです。
DWORD win_api::BeginQueueingMessages
(
Window const * windowList,
UINT length,
INT showCommandIndex
)
{
BOOL processMessages = TRUE;
BOOL isFirstIteration = TRUE;
while (processMessages)
{
for (UINT i = 0; i < length; ++i)
{
Window window = windowList[i];
HWND handle = window.getHandle();
MSG message = {};
if (isFirstIteration)
{
ShowWindow(handle, showCommandIndex);
UpdateWindow(handle);
isFirstIteration = FALSE;
}
if (GetMessage(&message, handle, NULL, NULL))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
else
{
processMessages = FALSE;
}
}
}
return 0;
}
最終的に、次のコード行が原因であることが判明しました。
Window window = windowList[i];
代入演算子の使用によってトリガーされる、自動的に実装されたコピー コンストラクターを呼び出すという間違いを犯しました。したがって、左側の演算子の内部 CHAR ポインターは、新しいヒープ メモリを割り当てることなく、windowList[i] のメンバーと同じ場所を指すようになりました。
その後、プログラムの終了時に、初期化されていないメモリ ブロックに対して delete[] が呼び出され、C ランタイム例外がスローされます。
これが役立つことを願っています。