1

我有一个静态链接到 MFC 的 .dll。在正常使用 .dll 期间,它会使用 .dll 创建一个工作线程AfxBeginThread。在该线程的函数内部,我创建了两个数组:

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

这些缓冲区将在程序执行期间改变大小(通常更大)。问题是,当程序退出时,线程的函数似乎终止了,而没有机会释放这些数组分配的内存。我ExitInstance()在 .dll 中有一个重载来进行其他清理,但是到达它的时间我已经收到了消息:

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 关闭函数并清理内存后,我得到以下信息:

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