社区
C++ Builder
帖子详情
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
打赏
收藏
exit()的迷惑
我在程序中用exit()函数终止程序,但我又用了new ,delete;不知道会不会引起内存泄漏! 如: Form1 = new TFor1(NULL); exit(0); Form1->ShowModal(); delete Form1; 在程序的其它地方我用了exit();当程序退出时,delete会不会执行! 如果exit()不会释放掉动态分配的内存,那么用什么函数终止程序,而又安全释放掉内存. 请高手指点!
复制链接
扫一扫
分享
转发到动态
举报
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)
Annoy-a-tron:惹恼并
迷惑
了MATLAB用户。-matlab开发
通过以随机的时间间隔做一些烦人的事情来慢慢地让 MATLAB 用户发疯。 自定义以部署您自己的个人邪恶品牌。 一些想法: >>发出哔声,哔声%发出声音>> disp('Why?'), 为什么 % 显示废话>> disp(datestr(now))%显示日期和时间>> 日历 % 显示日历>>图%打开图>> fprintf('\n') % 插入空行>> fprintf('>') % 增长提示>> disp('<<') % 反向提示>> disp('>>>') % 三重提示>> fprintf(2, '>>\n'); % 错误信息颜色提示>>
exit
%
exit
Matlab(真的,真的很邪恶) 要在 Matlab 启动时自动运行此函数,请从 startup.m 调用 annoyatron()。 有关更多信息,请参阅 Matlab 帮助中的“启动”。 灵感来自 Annoy-a-tro
c语言
exit
函数的作用,计算中心
在C语言中,经常会遇到使用
exit
函数直接结束程序运行的情况,
exit
和return的作用有些类似,特别是在main函数中出现时,经常令人
迷惑
:是该用
exit
还是return?或是随便用哪一个都行?二者到底有何区别?1.
exit
用于在程序运行的过程中随时结束、终止程序,
exit
的参数是返回给OS的。main函数结束时(使用return或
exit
)也会隐式(即自动)地调用
exit
函数。
exit
函数运...
关于fork与vfork,
exit
与_
exit
fork和vfork都是创建进程,
exit
和_
exit
都是退出进程,但之间也有些细微的区别,并且很让人
迷惑
。一般情况下用fork创建的子进程用
exit
结束,而用vfork创建的进程则用_
exit
。那他们具体的区别在哪儿了,为什么这么做! 预备知识:程序的存储空间布局,系统的缓冲区 c程序在内存中从高地址到低地址依次为: 命令行参数和环境变量:存储命令行的各个参数和...
System.
exit
(0)和System.
exit
(1)区别(让人
迷惑
的东西)
非0的情况下,都是非正常情况下退出(强制退出) System.
exit
(0)是将你的整个虚拟机里的内容都停掉了 ,而dispose()只是关闭这个窗口,但是并没有停止整个application
exit
() 。无论如何,内存都释放了!也就是说连JVM都关闭了,内存里根本不可能还有什么东西 System.
exit
(0)是正常退出程序,而System.
exit
(1)或者说非0表示非
YARN调度报错Stack trace:
Exit
CodeException
exit
Code=1解决方式
网上有很多解释,但是都不适合我,单纯看表面的堆栈信息,很容易
迷惑
,应该深入查看ApplicationMaster和NodeManager的日志。碰到过很多异常会有不合理的展示,导致使用者被表面迷糊,很难快速定位问题。 问题的具体堆栈信息如下Stack trace:
Exit
CodeException
exit
Code=1: at org.apache.hadoop.util.Shel
C++ Builder
13,873
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章