c++ delete什么

来源:百度知道 编辑:UC知道 时间:2024/06/23 00:25:09
搞不明白,new了以后就是要delete了!
但例如这样写QWidget *widget = new QWidget(this);然后我在它的父对象的析构函数delete widget;结果是出错的!
人家说上面我写的是一份拷贝,它本身的析构函数就释放了,而我再次delete它所以出错!

我想知道一般怎样定义的对象需要delete来释放内存呢?又是在什么时候释放呢?
int需要释放吗?数组需要释放吗?模板需要释放吗?
int *a=new int 这样这个a需要delete吗?

Q:
int需要释放吗?数组需要释放吗?模板需要释放吗?
A:
如果定义的是指针,且已经人工用new为其分配空间,则需要人工delete。如果使用的是malloc等C函数,则需要对应使用free来释放。
Q:
int *a=new int 这样这个a需要delete吗?
A:
需要。楼上回答错误,无论a是不是类,都需要delete。只不过如果是类,那么在delete a的同时,会析构a所有的成员,因此如果子类或者成员函数写法不当,可能会造成非法操作。
但这并不意味着a就不用delete了。

---------------------------------

关于释放不释放的问题,不需要去问,因为任何变量,注意,是“任何”变量,你一旦声明了,就存在一个释放该变量的问题。区别只是在于,这个释放的动作是由编译器,由系统自动去完成,还是由你程序员自己完成。

比如int a=0;这句,一般人会说,这个a不用释放了。但是这个说法不完整不全面,应该说,这个a不用我们程序员自己去释放了,在该变量的生存周期结束时(一般是对应的代码block末尾,即右大括号之前),由系统自动去释放。

但是系统对于动态申请的变量空间它是不管的,也就是说,new也好,malloc也好,申请到的空间系统不负责释放。举个例子:
/*1*/void test()
/*2*/{
/*3*/int *b = new int;
/*4*/*b = 0;
/*5*/delete b;
/*6*/}
这里,第3行,不用解释,指针变量的声明,第4行赋值,第5行这里注意,delete b这句只是把b这个变量所指向的空间(也就是我们用new申请到的空间)给释放了,而b这个变量本身还没有被释放(在32位编译器比如VC中,b这个时候依然占有4字节),因此,如果这时候给b再赋值,比如在delete后面加一句b=NULL;,是可以的。
那么到第6行,大括号前面,这时候函数即将结束了,b才被真正销毁。

-----------