m0_67001341 2023-06-08 09:24 采纳率: 69.2%
浏览 45
已结题

指针的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,不知道理解的有没有问题

  • 写回答

5条回答 默认 最新

  • 关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 修改了问题 6月8日
  • 修改了问题 6月8日
  • 展开全部

悬赏问题

  • ¥15 请问有没求偏多标签数据集yeast,reference,recreation,scene,health数据集。
  • ¥15 传感网应用开发单片机实训
  • ¥15 Delphi 关于sAlphaImageList使用问题
  • ¥15 寻找将CAJ格式文档转txt文本的方案
  • ¥20 数电设计提问求帮助,出租车计费器
  • ¥15 shein测试开发会问些啥我是写java的
  • ¥15 关于#单片机#的问题:我有个课程项目设计,我想在STM32F103veTX单片机,M3主控模块上设计一个程序,在Keil uVision5(C语言)上代码该怎么编译?(嫌钱少我可以加钱,急急急)
  • ¥15 opnet仿真网络协议遇到问题
  • ¥15 在安装python的机器学习程序包scikit-learn(1.1版本)时遇到如下问题
  • ¥15 要用 STM8L050J3M3TR 输出1路PWM 没有输出 不知道是不是 复用IO需要配置还是 定时器初始化的问题