指针的delete [] intArr和intArr=NULL

img


为什么这里 delete [] intArr可以释放所以intArr所占用的内存
但是intArr=NULL; 就只是把局部变量的intArr的值置为空了。
如果把代码改成

img


把指针的地址传过来可以实现把全部的intArr的值置为NULL。

那么,我寻思delete [] intAr的时候不也没传地址吗,传的不也是一个值吗?

怎么delete的时候释放所有intNULL在堆中的内存地址,intArr=NULL就只是改变局部intArr的值呢?

我的意思是,在其他函数进行delete [] intNULL的时候,可以释放全局所有intArr的地址,但是为什么在intArr=NULL的时候,到了主函数,主函数的intArr仍然没有被置为空?
我是这样理解的:

delete [] intArr应该检测到的一个值,这个值是实参intArr所指向的地址,所以它最终释放了这个实参intArr的地址,

而intArr=NULL,只是把releaseIntArr这个函数里局部的intArr的值变成了NULL,它在处理的时候,把intArr当作为了一个值去处理,即使这个值是一个地址,

因为我并没有对这个实参intArr进行&取址,所以实参intArr传进来的都只是一个值,而不是一个地址,

但是delete就不一样,delete [] intArr里的intArr同样是一个值,但是delete 应该把intArr这个值里的地址检测到了,它估计就直接把这个地址不当作值了,直接当作一个地址,在堆里把这个地址释放了,因为delete是用来释放地址的,所以我估摸着delete是直接忽略了intArr是一个值,把值里面的地址取出来,然后在堆里释放了这个地址,所以delete[] intArr可以释放全局的intArr的地址占用,但是intArr=NULL却只是被把一个局部intArr的值置为NULL,不知道理解的有没有问题

intArr 是一个指针,这个指针指向了一块内存地址,跟数组是一个道理,你在给它申请空间的时候,编译器会记录给它分配的空间大小,所以,使用delete[] intArr 表示删除分配给intArr的所有内存空间。(其实,这里不是删除,只是把分配给intArr的内存还给了编译器)
而 intArr = NULL ,只是让这个指针变成一个空指针,指针本身就是一个值,在delete[] intArr后,intArr指向的内存已被回收,intArr变成了野指针,这时候,为了避免误用,通常会用 intArr = NULL来把他设为空指针,如果后面不小心使用了空指针,编译器会报错,而如果没有intArr =NULL; 编译器不会刻意检查它是否是野指针,这就会导致内存访问错误。

挺好的问题,应该说每个C++初学者都必经的“坑”。简单说,delete 和 delete[] 两者的区别:delete arrayT 调用第一个成员deconstructor,delete arrayT[]调用每一个成员deconstructor。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

intArr是个指针
你可以把它理解成一个小纸条,上面写着坐标
delete是向这个坐标发射核弹,抹掉整个区域
而intArr=NULL是用橡皮擦把坐标擦了,小纸条变空白的了

对的,=NULL只是让这个指针不指向它了,并不会释放
这个很好理解,因为可以多个指针指向同一个内存
如果=NULL就释放了,系统并不知道还有没有别的指针是否还在指向这个内存呢