【问题标题】:Kill process and release memory in c++在 C++ 中杀死进程并释放内存
【发布时间】:2015-07-15 06:21:58
【问题描述】:

我有一个服务,它创建一个进程,然后释放它的内存。 我使用 createprocess() 函数,然后关闭进程和线程的句柄, 这是我的代码:

        if (CreateProcessA(NULL,
                           zAppName,//{ pointer to command line string }
                           NULL,     //{ pointer to process security attributes }
                           NULL,     //{ pointer to thread security attributes }
                           TRUE,     //{ handle inheritance flag }
                           0,
                           NULL,     //{ pointer to new environment  block }
                           NULL,     //{ pointer to current directory name }
                           &StartupInfo,    //{ pointer to STARTUPINFO }
                           &ProcessInfo))
    {
        WaitForSingleObject(ProcessInfo.hProcess,WaitMiliSec);
        GetExitCodeProcess(ProcessInfo.hProcess, &Result);

        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);    

        CloseHandle(hRead);
        CloseHandle(hWrite);
        return (Result);
    }

但是经过closehandle()函数后,hProcess和hThread还是有值的!!! 并且每次我的服务运行此代码时,内存都会增加并且不会减少!这是内存泄漏吗? 我该怎么办?

【问题讨论】:

  • 从句柄仍有其价值这一事实并不意味着该进程还活着。
  • 但是内存呢?当进程释放它!?(@marom)
  • 你有理由相信一些内存没有被释放吗?只是你自己程序中的一些 int 值没有任何意义。
  • 是的,在我创建进程后内存增加了,我在taskmanager中看到了,在我关闭句柄并且函数结束后,内存没有释放(@deviantfan)
  • WaitMiliSec 有多长,您确定它足够长以终止进程吗?

标签: c++ window


【解决方案1】:

当进程加载到内存中时,会加载以下元素: 1.代码 2.内存 2.PCB 4.数据等 当您关闭句柄时,只有部分堆(假设您正在使用 malloc 创建处理程序)被释放。所以其余元素仍然保留在进程堆栈中。所以你不能保证内存没有被释放。 是的 hProcess 和 hThread 可能有一些会造成混淆的值。但是这些指针 hProcess 和 hThread 将被称为“悬空指针”。因此,在取消分配后为指针分配空值是一个好习惯。

【讨论】:

  • 其余元素保留在堆栈中?这是内存泄漏吗?
  • 进程最终终止时不会卸载任何实际的剩余元素。但是如果你不关闭处理程序,就会造成内存泄漏(因为处理程序是从堆中分配的)。
  • 感谢您的回复@userNishant。我关闭了句柄,但每次我的服务运行此代码时,我都会在任务管理器中看到内存增加!!!主进程(我的意思是我的服务)终止时是否会卸载其余元素?
  • 其实每次加载主进程时,进程元素也会被加载,当进程终止时操作系统会解除分配给主进程的资源。
  • 那么你知道为什么我创建进程时任务管理器中显示的内存会增加而不是减少吗!?如果我运行此代码 10 次,内存也会增加 10 倍!!!: (
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2018-09-30
  • 1970-01-01
  • 2014-11-24
相关资源
最近更新 更多