BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #87230同步于 2015/5/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

c++小白求助

soleAman
2015/5/24镜像同步10 回复
析构函数释放堆内存: delete [ ] name; name=0; //name是一个字符指针 这句话怎么理解啊? 来自「北邮人论坛手机版」
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
rkk机器人#1 · 2015/5/24
http://www.cplusplus.com/reference/new/operator%20delete%5B%5D/ operator delete[] is a regular function that can be called explicitly just as any other function. But in C++, delete[] is an operator with a very specific behavior: An expression with the delete[] operator, first calls the appropriate destructors for each element in the array (if these are of a class type), and then calls an array deallocation function. 【 在 soleAman 的大作中提到: 】 : 析构函数释放堆内存: : delete [ ] name; : name=0; : ...................
hh1562535601机器人#2 · 2015/5/24
name指向动态分配的字符数组,用delete[ ]释放存储空间。 通过『我邮2.0』发布
kizy008机器人#3 · 2015/5/24
个人理解,name = 0,相当于name = nullptr; 消除悬空指针,如果没这么做,以后可能误用name所指向的内存(即使用了一个已经释放了的内存)
shan10211865机器人#4 · 2015/5/24
以后你可以先判断name是否=0来识别name指向的内存是否已经被释放掉,防止空指针异常
johnlee机器人#5 · 2015/5/24
0是相当于NULL,nullptr就是为了解决0的多义性问题提出来的 【 在 kizy008 的大作中提到: 】 : 个人理解,name = 0,相当于name = nullptr; 消除悬空指针,如果没这么做,以后可能误用name所指向的内存(即使用了一个已经释放了的内存)
nuanyangyang机器人#6 · 2015/5/24
【 在 johnlee 的大作中提到: 】 : 0是相当于NULL,nullptr就是为了解决0的多义性问题提出来的 其实,C语言里并没有把“指针”定义为“地址”。“指针”是对存储空间的引用。整数和指针之间互相转换,行为是由实现定义的。但C语言偏偏添加了一个特例:如果把0转换为void*,那么结果就是一个无效的指针。在stdlib.h里,NULL被定义为(void*)0。 C++引入nullptr实际上是避免了那个特例。
SychoalMS机器人#7 · 2015/5/24
宏定义里面 NULL就是 0
SychoalMS机器人#8 · 2015/5/24
指针是对存储空间的引用怎么说?我的理解是指针只是四个字节的内存而已。 【 在 nuanyangyang 的大作中提到: 】 : : 其实,C语言里并没有把“指针”定义为“地址”。“指针”是对存储空间的引用。整数和指针之间互相转换,行为是由实现定义的。但C语言偏偏添加了一个特例:如果把0转换为void*,那么结果就是一个无效的指针。在stdlib.h里,NULL被定义为(void*)0。 : C++引入nullptr实际上是避免了那个特例。
nuanyangyang机器人#9 · 2015/5/24
【 在 SychoalMS 的大作中提到: 】 : 指针是对存储空间的引用怎么说?我的理解是指针只是四个字节的内存而已。 : C语言对内存的抽象是“object”,不是面向对象的那个object,它的定义是“region of data storage”。 一个object有一个类型,object里存储的数据是这个类型的。变量对应object。比如局部变量int a;它的意思是a对应了一个int型的存储空间,里面存一个int型的数据。 指针是对存储空间的引用(也可以是对函数的引用,在C里面function不是object,但偏偏同时有指向function的pointer和指向object的pointer。这里只讨论object)。比如int *b = &a;现在,b是一个指针,它引用了变量a对应的存储空间。所以,*b = 42这样的赋值表达式,就可以修改a对应的存储空间里的内容。 但是C语言从来没有规定object要存放在内存里,也没有说pointer是地址。虽然这是一种合理的实现。 既然pointer不是地址,那么把pointer和整数之间相互转换,就没有意义了。起码C语言没有规定pointer转换成整数类型有什么意义(比如得到的整数代表什么)。实际上,pointer和合理的长度的整数之间的转换的意义是实现规定的(比如AMD64 ABI,或者编译器的规则)。 同样,既然pointer不是地址,不对应数字,任意的pointer之间比较大小也就没有意义了。比较相等是可以的:如果相等,那么它们就引用了同一块存储空间(object)。但有一个特例:如果两个指针都指向来自同一个数组的两个元素,那么在数组里,靠前的元素的指针小于靠后的元素。但是如果两个指针指向不同数组的元素,或者一个指针不指向数组里的元素,那么判断小于就没有意义了。 c语言从来没有规定指针和“4个字节”有什么联系。实际上,在x86_64里,一个指针本身占据8个字节。