关于NEW后的是否会造成内存泄漏??

IT-司马青衫
壹号网络官方账号
2003-05-16 08:35:26
比如说
ButtonClick()
{
TForm2 *Form2=new TForm2(this);
}
并没有 delete Form2;

下次再来下Click后,是否会重新生成个Form2,还是用回旧的了???
...全文
72 19 打赏 收藏 转发到动态 举报
写回复
用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

13,825

社区成员

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

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