c++ - 什么是过度递增指针显示?C++
问题描述
所以我一直在课堂上练习构造函数和解构函数。我已经引用了一个void
指向该类的指针,将其转换为int*
并增加了 15 次(类的大小为 1 )。这就是我所拥有的。
PS。忘了提到在这个例子中我已经将原始指针递减了 15 次。
created instance with value : 3
1
0x28ff1b
01101111
01101111
01101111
00000000
01101111
00000000
01101111
00000000
00000000
00000000
00000000
00000000
00000000
01110101
01011000
deleted instance
所以我的问题是:我在这里读什么?
我的基本假设是 cpp 代码的 PE,位于类变量的起始位置。但我不确定,我在十六进制编辑器中打开了 PE,但在任何地方都找不到“4f-4f-4f-00”系列。我正在使用带有 win 7 OS 和 c++11 的联想笔记本电脑。
解决方案
正如@Sam Varshavchik 所说并由@Jesper Juhl引用的那样,这是未定义行为的一个示例。
这些用户(和@user4581301)提到生成的代码undefined behaviour
会导致乱码。这里的主要问题是从void*
整数类型重铸,然后移出变量范围到未知数。
这样做,并操纵以这种方式获得的内存可以执行以下一项(或多项)操作:
- 没有什么
- 程序崩溃
- 整台电脑着火,桌子倒塌
- 任何其他可能发生的事情
当然,我绝不会推荐任何人在他们自己的机器上测试此代码,因为最坏情况的概率为 2/4。
推荐阅读
- materialize - 我可以限制截断中的字符数吗?它切断太多
- html - 如何设置默认过滤器月份和年份?
- c++ - 为什么 CMAKE 在被问到时不总是复制资源?
- webrtc - 尝试使用 gstreamer webrtc 进行流式传输时,“on-negotiation-needed”如何工作?
- symfony - Symfony & Doctrine - 用户注册后完成个人资料
- javascript - 使用 DOM 的 JavaScript 棋盘
- python - 在 instagram 中循环关注者的名字
- dart - 加载图像时,CircularProgressIndicator 小部件不会消失
- c# - 将像素列表声明为带有附加变量的 blob
- javascript - 使用 Ionic 3 从 Firebase 中删除数据