社区
C++ Builder
帖子详情
关于NEW后的是否会造成内存泄漏??
IT-司马青衫
壹号网络官方账号
2003-05-16 08:35:26
比如说
ButtonClick()
{
TForm2 *Form2=new TForm2(this);
}
并没有 delete Form2;
下次再来下Click后,是否会重新生成个Form2,还是用回旧的了???
...全文
72
19
打赏
收藏
关于NEW后的是否会造成内存泄漏??
比如说 ButtonClick() { TForm2 *Form2=new TForm2(this); } 并没有 delete Form2; 下次再来下Click后,是否会重新生成个Form2,还是用回旧的了???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
南郁
2003-05-20
打赏
举报
回复
to bigwhiteshark:
"
for(int i=0;i<100;++i)
TStringList StringList=new TStringList();
VCL 能编译能运行通过... "
从这话上看,只好说你真的不太懂得 C++了。这代码,如果TStringList有定义,则在哪个编译器下都可通过,因为人家完全符合C++基本语法。
不要去猜想VCL会有什么暗中操作。除了扩展的关键字。你就是一天没有学过CB,你可以通过语法看出:
new 一个或100个 TStringList ,没有人会为你来删除它。
南郁
2003-05-20
打赏
举报
回复
to bigwhiteshark:
个人认为你还是不懂VCL 。仔细去看看吧,TStringList 属不属于VCL的范畴?
to sczyq(我又...........):
我没有说Button会出错,我的原文是说:如果VCL没有做这方面的支持,那应该会出错。关于如何支持,我的贴中业已回答了。内中说到有些地方会指出错,指的是TFrame. Frame的VCL实现有BUG。
南郁
2003-05-20
打赏
举报
回复
dfgsdf
IT-司马青衫
2003-05-19
打赏
举报
回复
i top
南郁
2003-05-17
打赏
举报
回复
哇!楼主是著名的“大白鲨”啊。失敬失敬。知道吧。我们这边专门出了一种新啤酒,品名就叫“大白鲨”,今年国际马拉松赛指定的惟一庆功酒!我天天喝!
南郁
2003-05-17
打赏
举报
回复
说一说VCL的不用删除被Owner控件的事吧。这样初学者可以少困惑于,为什么老师三申五令要我一个new 对一个delete,一个new[] 对一个delete[]...可是到了VCL竟然不用?心里虚虚的
Owner 的机制:
首先,无论Owner 还是被Owner,都派生于祖宗:TComponent:.
一、作为被Owner者,构造时:通过 调用 Owner.InsertComponent ,将自加入
Owner的List.
这样,当Owner要析构时,它就会负责先析构自已List中的每个对像。
二、 另一个你可能猜到了,VCL既支持通过Owner删除一个被Owner者,也支持你直接delete 掉一个被Owner者。显然它需要惟护这一切,否则,你想你删除一个Button,此时这个Button的指针就成了“悬挂(指向一个已死的对像)”,而这个Button 的 Owner,可能是一个Form, 一会儿它也要删除这个Button,那不就立即出错?(事实上VCL在某些地方是有这个严重BUG)。
所以TComponent的析构里,要做一件事情:在自已临死前,通知Owner:我要自杀了,请你把我从你的List中移除吧,不用管我的事了……我走了!哎!白化人送黑发人啊!
三、非Owner与被Owner之间的“死亡通知”。
VCL这种机制,并不仅仅用于Owner关系上。也就是说它不是仅能在构造与析构上使用。事实让它是开放的。我们可以通过:FreeNotification 和 RemoveFreeNotification来惟护一个控件要向谁发出“死亡通知”。这样的机制太重要的,否则,程序员自已来惟护“悬挂”指针,太累了。
比如:一个 TToolbar, 它需要一个外部的TImageList,作为Button的图片。 那么,有没有想过,如果程序中你忽然delete掉这个TImageList呢? ———没有人可以用任何语法或规范来限制你不能这么做。这是TToolbar还傻傻地要画ImageList里的图标呢?
你会说,我可以在删除TImageList后,来个 ImageList1 = NULL啊?——你应该是没学好C++的少数派,把删除后的指针置为NULL是好主意,但和我们这里的话题无关。
不管如何,如果你还是心虚,你还是为你的Form写一个空的析构函数,然后把断点设上析构函数上。运行,退出,你会发现断点停住了。比如楼说的,你点三次按钮,那么就该停三次。
不过,具体问题具体分析,楼主的程序要关心不是有没有delete,则是这种程序能做些什么?可能光在那里猜我现在的Form2是哪一份的TForm2 吧:D
jishiping
2003-05-17
打赏
举报
回复
对于VCL控件,不能笼统的说要不要delete。对于Form来说,如果Form是用Show()来显示的,
你根本就无法用delete删除(因为无法知道Form什么时候关闭),此时只能在Form的事件
OnClose里写代码,让VCL自动删除Form:
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree; //这样VCL被关闭后,VCL会自动删除Form
}
对于主窗口,不用在FormClose里写代码,因为在主窗口的OnClose事件里,Action的缺省值
就是caFree。对于MDIChild窗口,Action 的缺省值是ccaMinimize(关闭时Form被最小话),
对于其它的窗口,Action 的缺省值caHide(隐藏)。
对于使用ShowModal()显示的窗口,也可以用上面的方法,在OnClose事件里写Action=caFree
而不用自己写delete Form;来删除。如果没有在OnClose事件里写Action=caFree,就需要在
ShowModal()后紧跟delete Form;这样的语句删除Form。
如果没有使用上面说的方法,Form就一直不会删除,此时一般来说Form只是隐藏看不见,而
并没有删除。直到程序结束时,VCL才会自动删除这些隐藏的Form。
ChengCheng2000
2003-05-17
打赏
举报
回复
同意楼上。
比如,在一个Form里new 一个子Button,即使不用delete ,Form 解构时也会自动把Button delete掉。
但编程时还是应该按照规范来做,就如myy所述的(很标准哦。:)
sczyq
2003-05-17
打赏
举报
回复
二、 另一个你可能猜到了,VCL既支持通过Owner删除一个被Owner者,也支持你直接delete 掉一个被Owner者。显然它需要惟护这一切,否则,你想你删除一个Button,此时这个Button的指针就成了“悬挂(指向一个已死的对像)”,而这个Button 的 Owner,可能是一个Form, 一会儿它也要删除这个Button,那不就立即出错?(事实上VCL在某些地方是有这个严重BUG)。
==================================================================
我想:delete Button 后,Button 的内存已经被释放,而且本身事先也会通知Owner我将释放。判断 if (Button) 肯定是 false ,Borlabd 的VCL 应该会做这方面的处理, 因此,Owner Form 释放时,应该不会再去删除这个Button, 所以不会立即出错?
sczyq
2003-05-17
打赏
举报
回复
二、 另一个你可能猜到了,VCL既支持通过Owner删除一个被Owner者,也支持你直接delete 掉一个被Owner者。显然它需要惟护这一切,否则,你想你删除一个Button,此时这个Button的指针就成了“悬挂(指向一个已死的对像)”,而这个Button 的 Owner,可能是一个Form, 一会儿它也要删除这个Button,那不就立即出错?(事实上VCL在某些地方是有这个严重BUG)。
==================================================================
Button
afei2002
2003-05-17
打赏
举报
回复
要看窗体的类型,如果是子窗体,不会有这种现象,其它的要delete~~~
IT-司马青衫
2003-05-17
打赏
举报
回复
^o^ ClickToTOP
IT-司马青衫
2003-05-17
打赏
举报
回复
这个吗? C++ 本人确实没有学的扎实...
但是 绝对不会犯如此低下的错误的....
毕竟我编程也有段时间了.............
以上各位所说的我都懂...............
问题在于...........................
TForm2 *Form2=new TForm();//(NULL)
NULL 和() 是不是有区别?
用Form2来讲,好象讲得不是很好.........
本意是 TStringList StringList=new TStringList(); //它没有指定谁负责释放
那么它谁负责,是Parent 还是 Application ?
如果循环生成
for(int i=0;i<100;++i)
TStringList StringList=new TStringList();
VCL 能编译能运行通过...
那么是不是生成了100个呢? 是不是100个同名的 还是100个不同名的?
它VCL 自动加1 2 3 4 5?
如果一切全VCL很好的处理掉了...
是不是可以引用到其它的组件中,比如说 *Form=new TForm()
myy
2003-05-16
打赏
举报
回复
TForm2 *Form2;
ButtonClick()
{
if(Form2!=NULL) Form2=new TForm2(this);
}
.....
delete Form2;
Form2=NULL;
........
「已注销」
2003-05-16
打赏
举报
回复
关注
asimpleman
2003-05-16
打赏
举报
回复
gz
zbc
2003-05-16
打赏
举报
回复
只一分呐:(,你每单击一次,是一定会生成两个实例窗体的,c++的标准是,有new就必须有delete
zcchm
2003-05-16
打赏
举报
回复
sorry,看错了,:)
我试一下,每次会重新生成一个TForm2的实例,不会用旧的。
这样生成的Form2和旧的完全一样,区别它们的只能由它们自己的this指针。
根据vcl的owner的作用,我想不用你主动delete,每个Form2都会被它的owner销毁释放资源。
zcchm
2003-05-16
打赏
举报
回复
编译器会报错吧,:)
你new的时候,this是Form2的owner,所以不用你主动delete,在程序退出时,owner负责销毁Form2
解决Android使用Handler
造成
内存泄露问题
一、什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收。也就是说,一个对象不被任何引用所指向,则该对象
会
在被GC发现的时候被回收;另外,如果一组对象中只包含互相的引用,而没有来自它们外部的引用(例如有两个对象A和B互相持有引用,但没有任何外部对象持有指向A或B的引用),这仍然属于不可到达,同样
会
被GC回收。 Android中使用Handler
造成
内存泄露的原因 private Handler handler =
new
Handler() { public voi
详解Android使用Handler
造成
内存泄露的分析及解决方法
主要介绍了详解Android使用Handler
造成
内存泄露的分析及解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
PHP对象递归引用
造成
内存泄漏
分析
通常来说,如果PHP对象存在递归引用,就
会
出现
内存泄漏
。这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,示例代码如下: <?php class Foo { function __construct() { $this->bar =
new
Bar($this); } } class Bar { function __construct($foo) { $this->foo = $foo; } } for ($i = 0; $i < 100; $i++) { $obj =
new
Foo(); unset($obj); echo m
浅谈返回函数内部
new
分配的内存的引用
在bbs看到了一个帖子:为什么不能返回函数内部
new
分配的内存的引用? lz是这样问的: 按照这句话, string& foo() { string* str =
new
string(abc); return *str; } 非法的,为什么? 其实,不能说这是非法的,只能说这种u编程习惯很不好,这样很可能
造成
内存泄露。 后面还有个回复是这样的: struct a_s { int a; }; a_s* foo() { struct a_s* sp =
new
struct a_s; return sp; } 这个挺好啊,为什么换成reference就泄漏了? 不能说这样写就
灵巧指针与垃圾回收(Java、C#、C++)
在JAVA 和 C# 中都有垃圾回收功能,程序员在分配一段内存后可以不再理
会
,而由垃圾回收自动回收,从而使程序员从复杂的内存管理中解脱出来。这是JAVA 和 C#的一大优点。而C++程序员在用
new
分配了一段内存后,还必须用 delete 释放,否则将
造成
资源泄漏。因此,一些C++ 书上经常告诫程序员:要养成好的习惯,
new
与 delete 要成对出现,时刻记住将内存释放回系统。但是,事情只是这么简单吗?
C++ Builder
13,825
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章