delete[] 的迷惑
delete[] 的不解?
//请问我下面这个程序是否有误?
//下面写的一个测试程序
------解决方案--------------------
new ,delete 主要做两件事情
第一,和C的 malloc,free 一样,管理堆空间,即分配和释放动态内存。
第二,构造和销毁动态对象。
从第一件事情上说:
因为内存一直存在,并不因仅为 new 就有了,也不会因为delete 就没有了;
所以 delete 的内存,只是重新处于被管理的状态。
delete 以后,没有其他new,delete 的情况下,继续使用,是不会有大的问题。
不过,这等于偷偷使用,是见不得光的。
这块内存已经被回收,你已经无权使用了。
一旦有别的new,delete 用到那块内存,就会出问题。
从第二件事情看,C++ 类的和C的数据类型不同.
是可以初始化和销毁的,没有构造的类,信息不全;
使用非常有可能会出错,所以一般动态分配需要,用到 new
而 new 的对象,需要销毁,所以需要 用到delete
delete 以后,对象不在有,完整的结构,所以,再继续使用就会出错。
struct Point3D 对于C++来说,是一种POD类型,就是C的数据类型的那种。
不需要构造,也不需要销毁,所以delete 以后,
在没有new,delete 等,管理对内存的操作的情况下,即使使用,也可能不会出错。
但是,这毕竟是一种,对动态内存的,非法使用,是一种非法操作。
是要尽量避免的行为。
有些时候,不是一定要出错,才是一种错误。
避免出错更重要,比出错再修改要好。
------解决方案--------------------
delete []是释放对象,但释放的对象的内存其余并不清除(事实上也没必要清除),就像删除一个文件,仅仅是在文件目录区删除文件名,将文件占用的空间置成未使用,而文件的内容实际上仍然存在。
这就是为什么一些硬盘,手机卡中的信息会泄露的原因。
//请问我下面这个程序是否有误?
define NUMPOINT 64为什么 delete[] pPoint 之后,还能看到pPoint指向第一个点???
struct Point3D
{
double x, y, z;
};
Point3D * pPoint = new Point3D[NUMPOINT];
//for(){ 给这64个点赋值上坐标信息x,y,z }
delete[] pPoint;
//下面写的一个测试程序
int *pNum = new int[64];为pNum什么delete[]之后,pNum 还是指向10????
for ( int i = 0; i != 64; i++)
{
*(pNum+i) = i + 10;
}
delete [] pNum;
C++
内存
struct
------解决方案--------------------
new ,delete 主要做两件事情
第一,和C的 malloc,free 一样,管理堆空间,即分配和释放动态内存。
第二,构造和销毁动态对象。
从第一件事情上说:
因为内存一直存在,并不因仅为 new 就有了,也不会因为delete 就没有了;
所以 delete 的内存,只是重新处于被管理的状态。
delete 以后,没有其他new,delete 的情况下,继续使用,是不会有大的问题。
不过,这等于偷偷使用,是见不得光的。
这块内存已经被回收,你已经无权使用了。
一旦有别的new,delete 用到那块内存,就会出问题。
从第二件事情看,C++ 类的和C的数据类型不同.
是可以初始化和销毁的,没有构造的类,信息不全;
使用非常有可能会出错,所以一般动态分配需要,用到 new
而 new 的对象,需要销毁,所以需要 用到delete
delete 以后,对象不在有,完整的结构,所以,再继续使用就会出错。
struct Point3D 对于C++来说,是一种POD类型,就是C的数据类型的那种。
不需要构造,也不需要销毁,所以delete 以后,
在没有new,delete 等,管理对内存的操作的情况下,即使使用,也可能不会出错。
但是,这毕竟是一种,对动态内存的,非法使用,是一种非法操作。
是要尽量避免的行为。
有些时候,不是一定要出错,才是一种错误。
避免出错更重要,比出错再修改要好。
------解决方案--------------------
delete []是释放对象,但释放的对象的内存其余并不清除(事实上也没必要清除),就像删除一个文件,仅仅是在文件目录区删除文件名,将文件占用的空间置成未使用,而文件的内容实际上仍然存在。
这就是为什么一些硬盘,手机卡中的信息会泄露的原因。