此程序是否泄漏内存

Does this program leak memory?

本文关键字:内存 泄漏 是否 程序      更新时间:2023-10-16

由于返回进程 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, "x40x40",  &pRecv );
这是

泄漏:

PROCESSENTRY32 *pe32 = new PROCESSENTRY32();

更好地使用:

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

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

是的,你是对的。分配内存而不稍后释放内存(如程序所做的那样)构成内存泄漏。

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

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

http://valgrind.org/