正在读取指向已删除内存未定义行为的指针
Is reading a pointer to deleted memory undefined behavior?
考虑
Foo* f = new Foo();
delete f;
Foo* g = f;
由于我读取了指向我不拥有的内存的指针,因此最终语句现在未定义吗?对我来说,它违反了"一到终"的规则,所以它应该是。
请注意,
Foo* f;
Foo* g = f;
未定义。
由于我读取了指向我不拥有的内存的指针,因此最终语句现在未定义吗?
不,声明
Foo* g = f;
本身不会调用未定义的行为。指针值的复制操作可以随时安全地完成。
但是,进一步使用指针f
或g
取消引用将导致删除f
后出现未定义的行为。
您甚至可以安全地使用这些指针值,例如用于日志记录目的:
std::cout << "g = " << g << std::endl;
请注意,
Foo* f; Foo* g = f;
未定义。
这种假设是错误的。它既不是未定义的行为,它再次取消引用未初始化的指针是未定义的行为,普通赋值不是。
您可以复制指针,没有什么可以阻止您这样做,但是指针指向已解除分配的内存,因此不应使用它。如果你确实使用它,你就会直接进入不确定的行为,所以这真的不是一个好主意。
由于f
指针本身仍在堆栈上,因此您可以放心地复制它。这只是一件奇怪的事情。
它可能不是有用的代码,但如果您将其视为删除后,f
包含一个过时的指针。 您示例将该过时的指针复制到 g
。 在你尝试通过过时的指针访问g
的东西之前,你并没有做任何非常糟糕的事情。
相关文章:
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- C++:私有类指针成员返回未定义的值
- 返回对未定义指针的引用
- 使用无效指针初始化指针声明符的行为是否未定义?
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 强制转换为指针引用是否会导致未定义的行为
- C++编译并链接到指向未定义函数的指针
- C++数组上的指针数学中的未定义行为
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- C 指针未定义的参考
- 将未定义的参数计数作为模板参数的函数指针
- 指针上的const_cast "this"是未定义的行为吗?
- 为什么指针减法是C++中未定义的行为?
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 为什么将指针指向std ::设置的提取节点是未定义的行为
- 使用已删除shared_ptr中的原始指针的未定义行为
- C++修改指向结构的指针向量会导致未定义的行为
- 未定义的引用:试图初始化来自不同类的对象的指针数组