能力值:
( LV2,RANK:10 )
|
-
-
2 楼
????????发表一下见解啊???乱猜想也好
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
createProcess返的结构里有 hProcess和hThread 都要关闭才可以
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
hProcess
hThread
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
试试。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
CloseHandle掉里面的hTread还是不行啊,句柄还是猛增加?有无什么工具可以看出这些句柄怎么没收掉的?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
内核对象都需要自己关闭把./
|
能力值:
( LV12,RANK:200 )
|
-
-
8 楼
/// @file prjTestHandle.cpp
/// @brief 测试某人说的CreateProcess句柄泄漏问题
/// build on vs2008
#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
BOOL bRc = TRUE;
const wchar_t * pPeName = L"c:\\windows\\system32\\notepad.exe";
wchar_t * pPeNameBuf = new wchar_t[MAX_PATH];
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
while (true)
{
_tcscpy_s(pPeNameBuf, MAX_PATH * sizeof(wchar_t), pPeName);
/// CreateProcess 的返回值是 BOOL, 不是HANDLE...
bRc = CreateProcess(
NULL,
(LPWSTR)pPeNameBuf, ///< 必须是一个Buffer,不能是一个常量串指针
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi);
if (bRc)
{
/// 如果要等被测试的notepad.exe执行结束, 就在这等
// ::WaitForSingleObject(pi.hProcess, INFINITE);
/// 如果不等带已经建立的notepad.exe结束
/// 为了防止句柄泄漏, 需要关掉pi的2个句柄
/// 关掉句柄后, 不影响已经建立的notepad.exe
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}
/// 实验结论
/// 不存在句柄泄漏问题. 说泄漏抓图上来
/// 拿一个都编译不过的东西上来讨论, 你尊重你自己和回你贴的人么?
}
return 0;
}
|
能力值:
( LV13,RANK:240 )
|
-
-
9 楼
真相在此。。。。。
|
能力值:
( LV12,RANK:200 )
|
-
-
10 楼
完善测试程序
/// @file prjTestHandle.cpp
/// @brief 测试某人说的CreateProcess句柄泄漏问题
/// build on vs2008
#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
BOOL bRc = TRUE;
DWORD dwProcessCnt = 0;
const DWORD dwProcessCntMax = 0x400; ///< 太多进程, 卡的不行
const wchar_t * pPeName = L"c:\\windows\\system32\\notepad.exe";
wchar_t pPeNameBuf[MAX_PATH] = {0};
/// 带 CreateProcess的这段程序, Debug版编译后, 在输出目录直接运行报错
/// 在堆操作那使用了无效的地址,
/// 被WinDbg断住后, 看不到此程序中有用的代码位置
/// 需要编译成Release版运行才正常
/// 如果需要调试, 编译成Release版带调试符号, 用WinDbg调试吧
/// 如果直接在Vs2008IDE中单步或全速运行Debug版的程序, 也是正常的
/// 很奇怪啊
STARTUPINFO si;
PROCESS_INFORMATION pi;
__try
{
while (true)
{
/// 每建立一个进程, 就休息一下, 防止CPU占用率过高
::Sleep(1);
/// 每次建立进程, 都需要重新设置si和pi ?
::ZeroMemory(&si, sizeof(STARTUPINFO));
::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
_tcscpy_s(pPeNameBuf, MAX_PATH * sizeof(wchar_t), pPeName);
/// CreateProcess 的返回值是 BOOL, 不是HANDLE...
bRc = CreateProcess(
NULL,
(LPWSTR)pPeNameBuf, ///< 要使用Buffer, 而不能是常量指针
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi);
if (bRc)
{
_tprintf(L"dwProcessCnt = 0x%X\r\n", dwProcessCnt);
/// 如果要等被测试的notepad.exe执行结束, 就在这等
/// 确实要等他结束, 这个应用应该是一个守护程序
/// 防止别人杀掉在自己的程序
/// 或在自己的程序Crash后,自己重启
/// 这段代码应该在一个服务中
::WaitForSingleObject(pi.hProcess, INFINITE);
/// 如果不等带已经建立的notepad.exe结束
/// 为了防止句柄泄漏, 需要关掉pi的2个句柄
/// 关掉句柄后, 不影响已经建立的notepad.exe
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
if (++dwProcessCnt == dwProcessCntMax)
{
/// 建立的进程够多了, 不搞了
break;
}
}
else
{
_tprintf(L"error, dwProcessCnt = 0x%X, GetLastError() = 0x%X\r\n",
dwProcessCnt,
GetLastError());
break;
}
/// 实验结论:
/// 不存在句柄泄漏问题
}
}
__finally
{
_tprintf(L"catch error, dwProcessCnt = 0x%X, GetLastError() = 0x%X\r\n",
dwProcessCnt,
GetLastError());
}
__tmain_END:
_tprintf(L"END, press any key to quit\r\n");
getwchar();
return 0;
}
|