这个程序泄漏内存吗?

时间:2012-06-29 20:15:02

标签: c++ windows

由于返回进程ID的新用法?如何通过调试我的应用程序来检查内存何时开始泄露? (对解释部分的长度检查确实很糟糕= P)

#include "stdafx.h"
#include "Process.h"
#include <TlHelp32.h>
#include <iostream>



DWORD GetProcessId( const wchar_t* szProcess )
{
    if( szProcess )
    {
        HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
        PROCESSENTRY32 *pe32 = new PROCESSENTRY32();
        memset( pe32, 0, sizeof( PROCESSENTRY32 ) );
        pe32->dwSize = sizeof( PROCESSENTRY32 );
        //Process32First( hSnapshot, pe32 );
        while( Process32Next( hSnapshot, pe32 ) )
        {
            if( pe32->szExeFile && !wcscmp( szProcess, pe32->szExeFile ) )
            {
                CloseHandle( hSnapshot );
                return( pe32->th32ProcessID ); //   std::wcout << pe32->szExeFile << std::endl;
            }
        }
        CloseHandle( hSnapshot );
    }
    return 0;
}

HANDLE GetProcessHandle( DWORD dwProcessId )
{
    if( dwProcessId )
        return( OpenProcess( PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessId ) );

    return 0;
}

bool WriteExternProcessMemory( HANDLE hProcess, void* pAddr, size_t uSize, const char* szWrite, LPCVOID outBuffer )
{
    if( pAddr && szWrite && hProcess )
    {
        DWORD dwOldProtect;
        if( !VirtualProtectEx( hProcess, pAddr, uSize, PAGE_EXECUTE_READWRITE, &dwOldProtect ) )
            return( !WriteProcessMemory( hProcess, pAddr, outBuffer, uSize, NULL ) );
    }

    return false;
}

- 编辑, 用法是:

void *pRecv;
WriteExternProcessMemory( GetProcessHandle( GetProcessId( _T( "notepad.exe" ) ) ), (void*)0x401000, 2, "\x40\x40",  &pRecv );

3 个答案:

答案 0 :(得分:7)

这是泄漏:

PROCESSENTRY32 *pe32 = new PROCESSENTRY32();

更好用:

PROCESSENTRY32 pe32 = {0};
pe32.dwSize = sizeof( PROCESSENTRY32 );
//Process32First( hSnapshot, pe32 );
while( Process32Next( hSnapshot, &pe32 ) )
...

此外,您还没有关闭在GetProcessHandle创建的句柄,这也是一个泄漏。

答案 1 :(得分:2)

是的,你是对的。分配内存而不会在以后释放内存,就像程序一样,构成内存泄漏。

您可以使用memory leak detector

在程序中找到泄漏

答案 2 :(得分:2)

Valgrind是一个很好的工具,可以告诉你有关内存泄漏的信息。如果您正在使用调试符号进行编译(-G用于GCC),它甚至会告诉您泄漏发生在哪一行!

http://valgrind.org/