按下DEL+ALT+CTRL 
程序结束后看看有没有多余的EXE,

解决方案 »

  1.   

    用debug模式来运行,当程序退出以后,系统会在output窗口警告你,有多余的内存没有释放
    并且可以指出是在什么语句引起的,很方便如果不用debug就比较麻烦了。用其他的内存监视软件把,看程序关闭后和未运行程序的时候,内存使用量有无变化
      

  2.   

    在DEBUG下按F5就可以在OUTPUT窗口中看见
      

  3.   

    我使用Boundcheck没有发现内存泄漏,检查代码也没有发现
    但是用CMemoryState类进行检查,报告说有一些字节在12个正常块中泄漏,有时候还报告说在CRT块中有内存泄漏,但我不知道它说的对不对,用不用管。
    问题是我运行的时候发现内存在缓慢地涨,因为我这个软件是要不停地运行的,所以我好担心
    如果运行的时候一遇到泄漏就报告就好了,不知道哪位大虾有这方面宝贵经验或其他好办法?
      

  4.   

    _CrtMemCheckpoint    <-设置检查点
    _CrtDumpMemoryLeaks  <-倾倒内存泄漏
    MFC的Wizard工程自动在程序运行结束后检查内存泄漏,如果要在程序运行中检查,则需要上面的函数调用,不过,这只能检查CRT堆中的内存泄漏,而且只能在DEBUG模式下。
      

  5.   

    // .h file#ifdef _DEBUGvoid* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine);
    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
      

  6.   

    把这两个文件加到你的工程中
    然后在每个cpp的头部加上以下代码
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    即可
      

  7.   

    两本书:《用C++调试程序》,《VC调试指南》.
    书名好像是错的,记不起来了。