-2

由于返回进程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 );
4

3 回答 3

7

这是泄漏:

PROCESSENTRY32 *pe32 = new PROCESSENTRY32();

更好的使用:

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

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

于 2012-06-29T20:18:25.037 回答
2

是的你是对的。正如您的程序所做的那样,分配内存而不释放它,构成内存泄漏。

您可以使用内存泄漏检测器查找程序中的泄漏。

于 2012-06-29T20:18:59.217 回答
2

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

http://valgrind.org/

于 2012-06-29T20:34:51.057 回答