为什么这个例子在指针上"bad!"?
Why is this example on pointers "bad!"?
我正在阅读《学习一门新的编程语言:面向Java程序员的c++》,这里有一个关于指针的例子:
永远不要解引用悬空指针(指向另一个已删除指针所指向的位置的指针):
int *p, *q;
p = new int;
q = p; // p and q point to the same location
delete q; // now p is a dangling pointer
*p = 3; // bad!
但是,如果我将此代码复制到main函数中并添加以下cout:
cout << p << " " << *p << endl;
我得到了输出:
0000022DC3DD0EF0 3
这对我来说似乎是有效的,我得到了指针,然后解值。
这是网页上的错别字,还是上面的代码不好?
这是未定义的行为。不能通过已删除的指针访问内存。
当你删除对象时,它的内存被标记为空闲,可以被其他对象使用,甚至返回给操作系统。但是没有人会因为从内存中删除对象而浪费CPU。所以p还在,但不再是你的了。你不能确定在那个地方存储了什么,甚至你仍然有权读取内存。
你的例子很简单,所以它的行为是可预测的。当在删除对象和访问其内存之间有很多工作要做时,事情就变得奇怪了。更糟糕的是,这些bug是浮动的,代码有时能正常工作,有时不能。所以它们很难调试
这对我来说似乎是有效的,我得到了指针,然后解值。
"未定义行为"允许的行为之一是产生让你认为一切都很好的结果。(然后停止在一个更复杂的程序中工作,因为您认为这不可能是问题)
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 为什么这个例子在指针上"bad!"?