比如 int* p = new int(1);
delete p;
就会在堆上分配一块内存,当作int类型使用,并赋值为1,将其地址储存在栈上的int*类型的p里。delete p会释放p所指向的内存。而这里p为一自动变量,其本身在程序退出其作用域时销毁。
用delete命令处理某个指针,说是把那个指针删除了是不正确的。
delete命令指示释放了那个指针原本所指的那部分内存而已。被delete后的指针p的值(地址值)并非就是NULL,而是随机值。
也就是被delete后,如果不再加上一句p=NULL,p就成了“野指针”,在内存里乱指一通。
如果在定义p的那个函数在delete了p后,没再调用p,就没什么问题,在这个函数结束后,p就会跟其它变量一样被消除。但若在那个函数里delete了p后,又没再给p赋值(地址值),再次调用p就危险了,因为这时p在内存里乱指,有可能指到一些重要地址,随时可能系统崩溃。
//p=NULL是个好习惯
//就像你蹲完厕所要洗手一样
《问题》危险的代码:
int* p=new int(1);
delete p;
delete p;
连续两次对同一个指针delete ,会造成严重的错误。编译器会检测出这样的错误吗?或许一些编译器会的,但别太过指望编译器。
第一次delete后,p自动为空(NULL)了吗?不是的。
在delete之前会自动检查p是否为空(NULL),如果为空(NULL)就不再delete了吗?确实是如此。
删除为空(NULL)的指针是不会有任何问题的吗?确实是如此。
#define SAFE_DELETE(p) delete (p); p = 0;
这样就就万事大吉了吗?好像不是的。
delete p+1;//在C++中是正确的
SAFE_DELETE(p+1)将会导致错误
没有好的方法解决重复释放这样的问题,只能靠程序员的细心了。
《结论》安全的代码:
int* p=new int(1);
delete p;
p = NULL;
(1)delete 一次以后,p成了野指针,它作为地址的值还是有效地没还可以访问它以前指向的内存,不过那片内存被重新格式化了;
(2)p不等于NULL,用 if(p) 语句不能判断它指向的内存是否有效(此时它指向的内存无效,p本身有效);
(3)delete 一次以后,不能再次delete,否则会报错;
(4)此时如果误用p指针,仍然可以修改内存的值和从该处取出数值,但此时数据不受保护,该内存空间可能被重新被分配给别的变量;
(5)如果p指向的空间再次被new函数分配,即使是分配给别的指针,即使分配大小与原来不一样,p又恢复了效力,可以改变内存的值,甚至可以重新被delete,p的作用与新分配的指针一样;
1.假如你不去释放,那么该区域的内存始终不能被其他数据所使用。
2.
指向
该内存的
指针
是个局部
变量
,当定义给
指针
的函数结束并返回时,
指针
也就消失了,那么就再也找不到该块的内存区域。
假如
指向
该内存区域的
指针
自动消失了,计算机就再也找不到该区域的内存了,就好像丢了这块内存一样,这
种情况称为“内存
p所指的
空间
。比如 int* p = new int(1);
delete
p;就会在堆上分配一块内存,当作int类型使用,并赋值为1,将其地址储存在栈上的int*类型的p里。
delete
p会释放p所
指向
的内存。而这里p为一自动
变量
,其本身在程序退出其作用域时销毁。
用
delete
命令处理某个
指针
,说是把那个
指针
删除
了是不正确的。
delete
命令指示释放了那个
指针
原本所指的那
部分
内存而已。被...
delete
p;
之后,
指针
指向
的内存
空间
已经释放了,该
指针
已经没有“实权”了,但是该
指针
还是存在,并没有消失,而且
指向
的地址也没有改变,这时对这个
指针
的任何操作都是危险的,很容易发生程序错误,这时候的p就是一个野
指针
,比如再次执行
delete
p操作,会使程序崩溃。良好的习惯是在
delete
之后,随后将该
指针
置NULL,如下:
int *p = new int(1);
delete
p;
p = NULL;
这时候发生
delete
p操
C++标准规定:
delete
空
指针
是合法的,没有副作用。所以我们一般在
delete
后就以为万事大吉了,其实这是不安全的。
我们在
Delete
指针
后赋值为NULL或0是个好习惯。对一个非空
指针
delete
后,若没有赋NULL,若再次
delete
的话
有可能出现问题。如下代码:
可以看出
delete
是释放
指针
指向
的内存,并不是
指针
本身所占有的内存。所以
delete
后,
指针
的
删除
指针
并不意味着这个
指针
就不存在了,只有在函数结束后,这个
指针
才会消失
delete
ptr;的作用是释放了
指针
原来
指向
的内存,此时的
指针
指向
为随机的,称为野
指针
如果野
指针
指向
系统中重要的内存地址,再次调用该
指针
的时候就可能导致系统崩溃
所以
删除
指针
后,要将相应的
指针
赋值为 nullptr
传递给
delete
的
指针
必须
指向
动态分配的内存,或者是一个空
指针
。
delete
一块并非new的内存,或将相同的
指针
值释放多次,其行为是未定义的。
编译器不能分辨一个
指针
所
指向
的对象是静态还是动态分配的。
编译器也不能分辨一个
指针
所
指向
的内存是否已经释放。
delete
一个已经
delete
的
指针
,为什么有时候会报错有时候不会?一个
指针
delete
后是什么状态?
reference1:使用
delete
删除
指针
(转) - romanten - 博客园 (c