sha*_*oth 27 c++ undefined-behavior
在C++的这一段中,delete this讨论了构造的使用.列出了4个限制.
限制1到3看起来很合理.但是为什么限制4在那里我"必须不检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情"?
我的意思this是又一个指针.为什么我不能把reinterpret_cast它int或者叫它printf()输出它的值?
And*_*ett 37
调用delete之后'this'的值是未定义的,并且您对它执行的任何操作的行为也是未定义的.虽然我希望大多数编译器做一些合理的事情,但是没有(在规范中)阻止编译器决定它在这种特定情况下的行为将发出代码来格式化你的硬盘.调用未定义的行为(几乎)始终是一个错误,即使您的特定编译器按照您希望的方式运行.
您可以通过在调用delete之前获取指针的副本(作为整数)来解决此问题.
Kei*_*thB 29
删除指针(此指针或任何其他指针)后无法对指针执行任何操作的原因是硬件可能(以及一些较旧的计算机)陷阱尝试将无效的内存地址加载到寄存器中.尽管它可能适用于所有现代硬件,但标准规定,对无效指针(未初始化或删除)唯一可以做的就是分配给它(NULL或来自另一个有效指针).
Ste*_*sop 28
啊哈!
3.7.3.2/4:"...释放函数应解除分配指针引用的存储空间,使所有指向解除分配存储的任何部分的指针无效.使用无效指针值的效果(包括将其传递给解除分配)功能)未定义".
请注意,这表示"使用值",而不是"取消引用指针".
该段并不具体this,它适用于任何已被删除的内容.