ExitProcess和内存的问题

MikeChen2003 2006-08-28 05:27:15
小弟我最近在改一个程序,发现该程序在退出程序时都只简单调用了exitprocess。
我想问一下,malloc、CreateFileMapping、MapViewOfFile、InitializeCriticalSection申请的资源会不会自动被释放。

我的理解是,malloc是从进程的堆内存申请的,它会随着进程的内存的释放而释放了。
CreateFileMapping是用CloseHandle关闭的,ExitProcess会关闭它的所有Handle,因此也没问题。
MapViewOfFile就不知道了,但是我试了一下,好像可用内存并没有减少。不过如果一个程序MapViewOfFile同一个handle几百次程序的内存占用会大大的增加。
InitializeCriticalSection申请的是系统资源,不知道会不会随着ExitProcess自动释放?
这些都是我的理解,还希望各位给出正解。

还有一个问题,我发现程序里边只用了InitializeCriticalSection,为什么我用BoundsChecker调了一下,他说有若干个InitializeCriticalSectionAndSpinCount 泄漏呢,不明白。

还有就是线程里边用ExitProcess和进程里边调用ExitProcess有什么区别。

还有就是多个进程不加锁的访问(读写)同一个比较小的共享内存会不会发生异常或者失败(不考虑未同步产生的异常)??

不同线程和主进程不加锁的访问(读写)全局变量比如数组会不会发生异常或者失败??


...全文
742 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MikeChen2003 2006-08-29
  • 打赏
  • 举报
回复
锁泄露是因为有些return的地方没有解锁吧。
不同线程访问共享内存一定要加锁,否则访问的时候此值被改变就会发生异常。
/////
在EnterCriticalSection之后肯定有一个LeaveCriticalSection,而且两者之间没有return的,也没有跳出
不同线程访问共享内存一定要加锁,否则访问的时候此值被改变就会发生异常.这个有没有确切的出处啊??因为我现在改的程序是从unix改过来的,全局变量满天飞,有没有可能在不考虑数据同步的基础上不用加锁啊?
littlepboy 2006-08-29
  • 打赏
  • 举报
回复
锁泄露是因为有些return的地方没有解锁吧。
不同线程访问共享内存一定要加锁,否则访问的时候此值被改变就会发生异常。
MikeChen2003 2006-08-29
  • 打赏
  • 举报
回复
///还有就是线程里边用ExitProcess和进程里边调用ExitProcess有什么区别。
我不知道怎么在进程里面调用ExitProcess。
程序的调度执行单元是线程,而不是进程。
你没有显式第调用CreateThread,那么你就在主线程中执行代码呢。
无论如何你都没有办法在进程中执行代码

这个说错了,我说的"进程里边调用ExitProcess"里的进程就是指主线程
aspnetwuxueyou 2006-08-29
  • 打赏
  • 举报
回复
///还有就是线程里边用ExitProcess和进程里边调用ExitProcess有什么区别。
我不知道怎么在进程里面调用ExitProcess。
程序的调度执行单元是线程,而不是进程。
你没有显式第调用CreateThread,那么你就在主线程中执行代码呢。
无论如何你都没有办法在进程中执行代码
aspnetwuxueyou 2006-08-29
  • 打赏
  • 举报
回复
但我不建议直接调用ExitProcess
比如说你直接调用了ExitProcess,可能在当前进程中使用了mutex,而其他进程正在等待这个进程的状态。而你调用ExitProcess时候mutex状态就丢失了。别的进程就不知道怎么办好了。调用ExitProcess要十分小心,除非你确认所有的状态都保存了,所有该通知的都通知了(比如说mutex, semaphore)。
aspnetwuxueyou 2006-08-29
  • 打赏
  • 举报
回复
在进程退出的时候,资源会自动释放的。
MikeChen2003 2006-08-29
  • 打赏
  • 举报
回复

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧