exit()的迷惑

bcbyh007 2002-11-28 10:57:33
我在程序中用exit()函数终止程序,但我又用了new ,delete;不知道会不会引起内存泄漏!
如:
Form1 = new TFor1(NULL);
exit(0);
Form1->ShowModal();
delete Form1;
在程序的其它地方我用了exit();当程序退出时,delete会不会执行!

如果exit()不会释放掉动态分配的内存,那么用什么函数终止程序,而又安全释放掉内存.
请高手指点!
...全文
150 53 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
kennidy 2002-12-20
  • 打赏
  • 举报
回复
任何程序员请主动释放你用过内存,如果你可以做到的话
因为有一个问题是大家都在windows下写程序,ms考虑得很周到
但是如果在unix下不做delete后果自负 :)

感谢borland 感谢gnu 感谢linux
kennidy 2002-12-20
  • 打赏
  • 举报
回复
呵呵 很激烈呀
我同以靶子的意见 但是有一点请靶子注意
操作系统主动善后只有在win9x me nt win2k xp win.net才会出现
如果是dos和win32的年代和古老的unix
要是不做delete哭都来不及呀
耙子 2002-12-10
  • 打赏
  • 举报
回复
谢谢楼主!谢谢各位。
bcbyh007 2002-12-09
  • 打赏
  • 举报
回复
怎么送分送不出去?
bcbyh007 2002-12-09
  • 打赏
  • 举报
回复
结帐:
pazee(耙子) (20分)

分少了一点,但表示我的敬意!
wangxiangsjz 2002-12-06
  • 打赏
  • 举报
回复
pazee(耙子) :
非常感谢你的精彩论述!让我有一种顿悟的感觉。深深地表示谢意。
耙子 2002-12-05
  • 打赏
  • 举报
回复
wangxiangsjz(王翔)
其实很多人和你一样,主要是你们去理解操作系统的内存管理方式和内存泄漏的意思。

main ()
{
char *p;
p= new char[1024*1024*200]; // 申请200M的内存
exit();
}

这段代码住不过是一个例子,但是它完全可以运行,你可以用bcb编写一个控制台文件,但不跟踪,看看内存占用的变化,然后看看整个程序退出后内存是否释放了。

内存泄漏的概念单单存在进程的内部,类似上面代码的泄漏,只是程序内部得泄露,大部分是指针丢失,或者忘记了释放,操作系统是牢牢记住了的,他会在你程序终止后善后的。

首先你的编译程序不是单纯的翻译了这么几行代码,他在运行之初会初始化堆和栈和一些寄存器。在程序结束前,他还会恢复这部分内容,在此之前你在进程里面申请登记了的一切东西他都给你释放了。然后,操作系统再彻底回收分配给你的这段空间,你的程序就灰飞烟灭了。

可以这样比喻,你的程序就像给你一片空地,你在这个空地上随你折腾,丢东西也好(发生了程序内部的内存泄漏),出错也好。但是你程序一但退出,操作系统就把这片空地都回收了,虽然你自己申请空地自己忘了(指针丢了),但是操作系统回全部登记了,因为你的一切申请都是通过操作系统来完成的。

很多人过分的担心内存泄漏对程序的影响,一个程序不存在错误现在看基本上不可能,软件的错误大月份为了5个级别,最严重的是致命级,导致程序不能实现需要的功能,最轻的就是可以忽略的,比如一个菜单或者标签的内容写错了一个字母。同一个问题在不同的程序中导致的问题也不一样,如果你只是一个短期运行的程序,比如excel,他有点内存泄漏并不致命,最多excel耗费空间大了很多,但是你可以重新启动,但是对于sqlserver来说,存在内存泄漏就致命了,因为这个程序跑起来就是几个月甚至几年。总之,一句话,功能、成本为前提,不可能排除程序全部的错误,测试的作用不是证明程序的正确性,而是为了发现错误。
pms 2002-12-05
  • 打赏
  • 举报
回复
再次支持pazee(耙子) !
gfh21cn 2002-12-05
  • 打赏
  • 举报
回复
CB有个工具CodeGuard是检查内存泄漏的
另外如果想安全一点

TForm *Form1;
try
{
Form1=new TForm(this);//这里最好定义this(属主),如果你忘了,呵呵,VCL会帮你释放的。
Form1->ShowModal();
}
__finally//不管怎么样都是要执行下面的一句
{
delete Form1;
}
yuanque 2002-12-05
  • 打赏
  • 举报
回复
好像不可以
whitelion 2002-12-05
  • 打赏
  • 举报
回复
继续学习
bcbyh007 2002-12-05
  • 打赏
  • 举报
回复
精彩!
还是精彩!
感谢!
让所有程序员都思考一下!
尤其象我刚出道的Programmer.
wangxiangsjz 2002-12-05
  • 打赏
  • 举报
回复
我越来越糊涂了,难道真的可以象这样写程序吗?
main ()
{
char *p;
p= new char[1024*1024*200]; // 申请200M的内存
exit();
}
这好像是不允许的吧?
耙子 2002-12-04
  • 打赏
  • 举报
回复
存在串口被占用不能继续使用的问题,不是说明程序操作串口不通过操作系统,操作系统人仍然管理串口,这只能说明串口驱动或者操作系统的不完善性。
耙子 2002-12-04
  • 打赏
  • 举报
回复
“不过你们说的操作系统会管理所有资源也不完全对”
从这句话我能知道你没学过操作系统,至少没有仔细的学习。你的一切都是自己想当然的理解。
我上学的时候也才70多分,但是有些关键的东西还是理解个皮毛了。
所谓的内存泄漏,是指在进程内部的, “自己分配的内存,自己考虑释放”你理解的太片面了,这句话应该理解为在程序内部的问题,是个编成的基本要求,就是自己的全部资源可控。

类似串口、并口这类的东西有一个多进程访问互斥资源的问题,容易死锁,直接死锁是比较容易解决的,间接死锁是不可能完全解决的。大部分情况,尤其在nt下,用CreateFile打开的串口,即使你的程序崩溃了,他仍然能正常的复位,而且理想的操作系统也要求复位。

但是你还是要记住,操作系统的作用就是管理分配资源,任何资源的使用,都是通过操作系统去申请和管理的(实际中存在绕过操作系统访问硬件的情况,但是这并不正常而且不安全)。

最后,希望你文明点我认为“我靠”不是什么好词。
井中老男孩 2002-12-04
  • 打赏
  • 举报
回复
我靠,问题没解决掉,怎么会跑呢
不过
用C++编程永远都要记住,自己分配的内存,自己考虑释放。这句话总不会错的。
井中老男孩 2002-12-04
  • 打赏
  • 举报
回复
我刚才把我认为会产生泄漏的内存申请函数都试了一遍,发现程序退出时这些内存确实释放了,这倒是出乎我的意料之外,我以前认为在堆中申请的内存不会别释放,这是我想当然了,原来这个堆也是程序申请好的,我们的内存申请函数是从这个堆中申请内存的。
不过你们说的操作系统会管理所有资源也不完全对
有些资源也是不会释放的
比方串口资源,我打开了串口,如果不关闭串口,操作系统不会给你关掉
耙子 2002-12-04
  • 打赏
  • 举报
回复
人呢?跑了?
liufeiyang 2002-12-04
  • 打赏
  • 举报
回复
Up
耙子 2002-12-04
  • 打赏
  • 举报
回复
你的程序都终止了,操作还会给你保留这片内存吗?


main ()
{
char *p;
p= new char[1024*1024*200]; // 申请200M的内存
exit();
}

你认为这个程序终止了,这200M内存会不会释放?
加载更多回复(33)

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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