1

MFC に静的にリンクされている .dll があります。.dll の通常の使用中に、.dll を使用してワーカー スレッドが作成されますAfxBeginThread。そのスレッドの関数内で、2 つの配列を作成します。

CByteArray ReadBuffer;
ReadBuffer.SetSize(92);
CByteArray PacketBuffer;
PacketBuffer.SetSize(46);

これらのバッファは、プログラムの実行中にサイズが変更されます (通常ははるかに大きくなります)。問題は、プログラムが終了すると、スレッドの関数が、これらの配列によって割り当てられたメモリを解放する機会を得ることなく終了したように見えることです。他のクリーンアップを行うためにオーバーロードされた .dllを持っていExitInstance()ますが、到達した時点で既に次のメッセージが表示されます。

The thread 'Win32 Thread' (0x2208) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x1e34) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x1ff8) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x1fc0) has exited with code 0 (0x0).

これらは、スレッドが実行の途中で終了していることを示しており、デストラクタを呼び出したり、クリーンアップを実行したりする時間がないようです。

オーバーロードされた関数を使用して独自のCWinThreadオブジェクトを作成しようとしましExitInstance()たが、その関数が呼び出される前にそれらのスレッドが終了します。

.dlls close 関数が呼び出されてメモリがクリーンアップされると、次のようになります。

Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\array_b.cpp(110) : {258} normal block at 0x023686E8, 2048 bytes long.
Data: <                > C6 F9 1D C0 E2 0C 00 00 00 00 AA 00 C0 11 E0 11 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\array_b.cpp(110) : {201} normal block at 0x02366F00, 64 bytes long.
Data: <b           @   > 62 F9 1D C0 81 09 00 00 00 00 7F 00 40 11 E0 10 
Object dump complete.

ReadBuffer上からとによって引き起こされた漏れを示していPacketBufferます。プログラムが終了する前に、スレッドを適切に閉じてメモリをクリーンアップする方法が見つかりません。使用できるスレッドを正常に終了する方法がありますが、プログラムが終了する前にそれを実行する場所が見つかりません。

プログラムが終了しているため、これが大きな問題であるかどうかはわかりませんが、.dll は安全のために自身のメモリをすべてクリーンアップする必要があると常に考えていました。

4

0 に答える 0