行。所以这个内存泄漏随机发生。我尝试在原始程序的简化版本中重现它。它是一个VC ++控制台应用程序,带有MFC的通用头文件。
以下是我的memManager类,它最初是一个图像校正类,用于管理内存并处理图像。
typedef struct Point
{
int x;
int y;
}TPoint;
class memManager
{
public:
memManager();
~memManager();
void AllocMemory(TPoint **pAddr, int nSize);
void ReleaseMemory(TPoint **pAddr);
void ReleaseAllMemory();
TPoint* ptsPtr;
};
memManager::memManager()
{
ptsPtr = NULL;
}
memManager::~memManager()
{
ReleaseAllMemory();
}
void memManager::AllocMemory(TPoint **pAddr, int nSize)
{
if (*pAddr != NULL)
return;
TPoint *pTempAddr;
pTempAddr = new TPoint[nSize];
memset(pTempAddr, 0, sizeof(TPoint)*nSize);
*pAddr = pTempAddr;
return;
}
void memManager::ReleaseMemory(TPoint **pAddr)
{
if (*pAddr != NULL)
{
delete[] * pAddr;
*pAddr = NULL;
}
return;
}
void memManager::ReleaseAllMemory()
{
ReleaseMemory(&ptsPtr);
return;
}
这是主函数中的代码。
memManager myMemManager;
myMemManager.AllocMemory(&myMemManager.ptsPtr,5000000);
system("pause");
当我调试程序时,控制台窗口会显示“按任意键继续”提示。然后单击关闭按钮关闭窗口。十分之一,visual studio的输出窗口显示以下内容:
Detected memory leaks!
Dumping objects ->
{83} normal block at 0x000001FC942D9070, 40000000 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Object dump complete."
The program '[348] testForMemLeak.exe' has exited with code -1073741510 (0xc000013a).
我发现重现结果很棘手。只有在“忙”蓝色圆圈消失后立即点击关闭按钮时,才能收到内存泄漏消息。
是因为我的内存处理功能不够好,还是因为当我关闭控制台窗口的时机不正确时控制台应用程序拒绝调用memManager的析构函数?
感谢。