社区
C++ Builder
帖子详情
关于NEW后的是否会造成内存泄漏??
IT-司马青衫
壹号网络官方账号
2003-05-16 08:35:26
比如说
ButtonClick()
{
TForm2 *Form2=new TForm2(this);
}
并没有 delete Form2;
下次再来下Click后,是否会重新生成个Form2,还是用回旧的了???
...全文
217
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
重载
new
和delete来检测
内存泄漏
1. 简述
内存泄漏
属于资源泄漏的一种,百度百科将
内存泄漏
分为四种:常发性
内存泄漏
、偶发性
内存泄漏
、一次性
内存泄漏
和隐式
内存泄漏
。 常发性指:
内存泄漏
的代码
会
被多次执行到。偶发性指:
内存泄漏
的代码只有在特定的条件下才
会
执行到。一次性指:
内存泄漏
的代码只
会
被执行到一次。隐式指:程序在运行中不断的开辟内存,知道程序结束时才释放内存,本质上虽然没有
内存泄漏
,但是如果这个程序在连续运行很...
内存管理(二)
new
[] 使用 delete
造成
内存泄漏
正文 在说明使用
new
[]申请内存,而使用delete释放的问题之前,先了解
new
[] 和 delete[] 的工作方式。 一.
new
[] 1.调用operator
new
[] ,由operator
new
[]调用n次operator
new
来分配n个对象的空间。 2.调用n次构造函数。 二.delete[] 1.调用n次析构函数。 2.调用operator delete[] ,由operator delete[]调operator delete来释放空间。 先探究一下
是否
真的是这样的: #include
从默认析构函数学习c++,
new
,delete,
内存泄漏
,野指针
默认析构函数: 当系统没有显式定义析构函数,编译器同样
会
为对象定义一个默认析构函数,默认的析构函数只能释放普通数据成员所占用的空间,无法通过释放通过
new
和malloc进行申请的空间,因此避免
内存泄漏
,我们要显式的析构函数对申请的空间释放。
内存泄漏
(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,
造成
系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重...
重载operator
new
实现检测
内存泄漏
是否
可行
行与不行,就凭我这水平,说出来未免显示太过自大。不还,我还想根据自己的代码来讨论这个问题。 重载operator
new
来检测内存只的办法,那就是在
new
的时候记录指针地址及文件名、行号,在delete的时候取消记录。到最后程序结束,还有哪些指针未释放,则为泄漏。 第一步,你得重载operator
new
,或者也可以重写。在http://www.cplusplus.com/refe...
C++ 浅谈
new
/delete, operator
new
/operator delete,malloc/free和
new
/delete的区别 ,
内存泄漏
文章目录:1. C/C++内存分布2. C语言中动态内存管理方式3. C++内存管理方式3.1
new
/delete操作内置类型3.2
new
和delete操作自定义类型 1. C/C++内存分布 (1) 栈又叫堆栈,非静态局部变量/函数参数/返回值等等都在栈上,栈是向下增长的 (2)内存映射段是高效I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信 (3)堆用于程序运行时动态内存分配,堆是向上增长的 (4)数据段–存储全局数据和静态数据 (变量) (5)代
C++ Builder
13,871
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章