使用已删除的指针地址.据我所知,
Use of a deleted pointer address
(*(据我所知,该标准允许实现来修改delete
操作员的操作数,但是大多数实现都不会这样做。
int* ptr = new int(0);
delete ptr; //delete is allowed to modify ptr, for example set it to 0
std::cout << ptr; // UB?
确认(*(,读取ptr
(以打印它的形式(是否定义明确?
如果delete
修改了ptr
,是否允许设置陷阱值,这将使读取ptr
UB?
在C 中14这是实现定义的行为,[basic.stc.dynamic.deallocation]/4:
如果标准库中给出的交易函数的参数是一个指针,而不是零指针值,则DealLocation函数应处理指针引用的存储空间,使所有指向交易量存储的任何部分的指针无效。
通过无效的指针值并将无效的指针值传递给DealLocation函数的间接行为具有不确定的行为。无效的指针值的任何其他用途都具有实现定义的行为。
有一个脚注:
某些实现可能定义复制无效的指针值会导致系统生成的运行时故障。
这发生了变化,因为C 11,大胆的文本说"不确定的行为",并且没有脚注。
为了回答您的问题,允许delete ptr;
设置陷阱值,该值将导致std::cout << ptr
的运行时故障。编译器文档必须指定行为。这是一个比UB狭窄的限制,在这种情况下,任何不稳定的行为都是可以允许的。
在此示例中,默认情况下, std::cout << ptr
并不是未定义的行为,因为 ptr
根本没有被删除,因此实际上设置了什么值。
默认情况下,STL不能为int*
指针定义operator<<
。它定义:
operator<<
的CC_12,用于打印零终止文本。void*
的通用operator<<
,它只需打印指针所设置的内存地址本身,而不是指向的数据。
由于int*
隐式转换为void*
,因此调用std::cin << ptr
实际上是在调用operator<<(std::cin, (void*)ptr)
,因此打印了ptr
保留的内存地址。
只有当您的应用程序定义了自己的operator<<
的int*
,然后在删除指针后尝试将其解释。
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 如何将std :: System_error异常与std :: errc值进行比较.据我了解,
- Vulkan中的抽奖活动之间的同步.据我了解,
- 为什么要拿参考的地址给我一个第二等级的指针
- 结构中的位顺序不是我所期望的
- 使用已删除的指针地址.据我所知,
- Microsoft Visual Studio发现我所有的CUDA设备端函数都有错误
- 特征 3 断言在求解线性系统时失败 - 据我所知,这是由于特征中的无效索引
- C 中对象方法的地址.据我所知,
- 我在 main 下的输出不是我所期望的
- 为什么我所有的 mpi 线程都是大师
- 引用数据类型的 & 符号是否返回引用本身的地址或它所引用的值
- 我需要使用嵌套的 while 循环打印一个正方形。我想我已经用正确的逻辑对其进行了编码,但它没有给我所需的输出
- 据我所知,根据 C++14 中的 §5.19/3 和 §5.19/2 编写,此代码不应编译
- 如果知道IP地址,我可以拍摄远程机器的屏幕截图吗
- 据我所知,下面的函数不是constexpr,而是用clang和g++编译的代码.我错过了什么
- inotify并没有以我所期望的方式通知我
- 为什么在C++中,类的大小必须始终为其用户所知
- 如果我知道一个值的地址,我可以访问它吗?
- 编译错误,据我所知不是错字