按下DEL+ALT+CTRL
程序结束后看看有没有多余的EXE,
程序结束后看看有没有多余的EXE,
解决方案 »
- 如何在产生一张大的背景图片啊
- 100分求教显卡性能测试程序
- CComboBOx的AddString
- 如何 在vc++6.0中实现类似于示波器波形显示?急
- 求可以统计网络流量的VC代码,就象是金山网镖下面的那样。。接收××K,发送××K,那种,会的千万帮忙阿。。。。
- 有关.net vc++集成开发环境的问题,高手请进!
- 为什么访问局域网文件时用WNetAddConnection2函数只能登录到一台机器,请各位指教!
- 怎样设计弹出式菜单?
- boost::singleton_pool 之ordered_malloc/ordered_free谨慎使用。
- (急)继续求助,视图显示问题
- ??????????????????救急救急救急!!!!!!!!!!!!!!!!!
- 我正从C++ Builder 5->Visual C++,我想请问……?
并且可以指出是在什么语句引起的,很方便如果不用debug就比较麻烦了。用其他的内存监视软件把,看程序关闭后和未运行程序的时候,内存使用量有无变化
但是用CMemoryState类进行检查,报告说有一些字节在12个正常块中泄漏,有时候还报告说在CRT块中有内存泄漏,但我不知道它说的对不对,用不用管。
问题是我运行的时候发现内存在缓慢地涨,因为我这个软件是要不停地运行的,所以我好担心
如果运行的时候一遇到泄漏就报告就好了,不知道哪位大虾有这方面宝贵经验或其他好办法?
_CrtDumpMemoryLeaks <-倾倒内存泄漏
MFC的Wizard工程自动在程序运行结束后检查内存泄漏,如果要在程序运行中检查,则需要上面的函数调用,不过,这只能检查CRT堆中的内存泄漏,而且只能在DEBUG模式下。
void* __cdecl operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
//void __cdecl operator delete(void* p);
void __cdecl operator delete(void *p, LPCSTR, int);#define DEBUG_NEW new(THIS_FILE, __LINE__)#endif //_DEBUG
class CDiagnosis
{
public:
CDiagnosis();
~CDiagnosis();
};
// .cpp file
BOOL IsValidAddress(const void* lp, UINT nBytes,
BOOL bReadWrite /* = TRUE */)
{
// simple version using Win-32 APIs for pointer validation.
return (lp != NULL && !IsBadReadPtr(lp, nBytes) &&
(!bReadWrite || !IsBadWritePtr((LPVOID)lp, nBytes)));
}BOOL IsValidString(LPCWSTR lpsz, int nLength /* = -1 */)
{
if (lpsz == NULL)
return FALSE;
return ::IsBadStringPtrW(lpsz, nLength) == 0;
}// As above, but for ANSI strings.BOOL IsValidString(LPCSTR lpsz, int nLength /* = -1 */)
{
if (lpsz == NULL)
return FALSE;
return ::IsBadStringPtrA(lpsz, nLength) == 0;
}#ifdef _DEBUG
void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine)
{
return _malloc_dbg(nSize, nType, lpszFileName, nLine);
}void* __cdecl operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
return _malloc_dbg(nSize, _NORMAL_BLOCK, lpszFileName, nLine);
}
/*
void __cdecl operator delete(void* p)
{
_free_dbg(p, _NORMAL_BLOCK);
}
*/
void __cdecl operator delete(void *pObject, LPCSTR, int)
{
_free_dbg(pObject, _NORMAL_BLOCK);
}
#endif //_DEBUG#ifdef _DEBUG
static _CRT_DUMP_CLIENT pfnOldCrtDumpClient = NULL;void __cdecl _CrtDumpClient(void * pvData, unsigned int nBytes)
{
CDumpContext dc;
char sz[256];
CObject* pObject = (CObject*)pvData;
__try
{
// with vtable, verify that object and vtable are valid
if (!IsValidAddress(*(void**)pObject, sizeof(void*), FALSE) ||
!IsValidAddress(pObject, pObject->GetRuntimeClass()->m_nObjectSize, FALSE))
{
dc << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n";
wsprintfA(sz, "an invalid object at $%08lX, %u bytes long\n",
pvData, nBytes);
dc << sz;
dc << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n";
}
else
{
dc << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n";
wsprintfA(sz, "a %hs object at $%08lX, %u bytes long\n",
pObject->GetRuntimeClass()->m_lpszClassName, pvData, nBytes);
dc << sz;
dc << "Dump " << pObject->GetRuntimeClass()->m_lpszClassName << "\n";
pObject->Dump(dc);
dc << "\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n";
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
// short form for trashed objects
wsprintfA(sz, "faulted while dumping object at $%08lX, %u bytes long\n",
pvData, nBytes);
dc << sz;
}
if (pfnOldCrtDumpClient != NULL)
(*pfnOldCrtDumpClient)(pvData, nBytes);
};
#endif // _DEBUG
CDiagnosis::CDiagnosis()
{
#ifdef _DEBUG
int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
_CrtSetDbgFlag(nOldState | _CRTDBG_LEAK_CHECK_DF);
ASSERT(pfnOldCrtDumpClient == NULL);
pfnOldCrtDumpClient = _CrtSetDumpClient(_CrtDumpClient);
#endif
}CDiagnosis::~CDiagnosis()
{
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
_CrtSetDbgFlag(nOldState & ~_CRTDBG_LEAK_CHECK_DF);
_CrtSetDumpClient(pfnOldCrtDumpClient);
#endif
}#ifdef _DEBUG
#pragma init_seg(lib)
CDiagnosis __Diagnosis;
#endif
然后在每个cpp的头部加上以下代码
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
即可
书名好像是错的,记不起来了。