经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++ 未初始化内存出现 flashback
来源:cnblogs  作者:mkckr0  时间:2021/12/24 9:09:24  对本文有异议

在 C++ 中分配一个未初始化内存,然后读取它,会读取到这块内存之前被使用所留下的值,这种现象我称之为 flashback。

  1. 栈内存很容易出现这种现象,而且很容易观测出某种规律。
  1. for (int i = 0; i < 10; ++i) {
  2. int a;
  3. std::cout << a << " ";
  4. a = i;
  5. }

这段代码可能输出

  1. 0 0 1 2 3 4 5 6 7 8

除了第一个 0,其余的 0 1 2 3 4 5 6 7 8 都是 flashback 的结果

  1. 堆内存也会出现这种现象,但是很难观测出规律。
  1. struct A
  2. {
  3. int8_t m1[13];
  4. int x;
  5. };
  6. for (int i = 0; i < 10; ++i) {
  7. A* a = new A;
  8. std::cout << a->x << " ";
  9. a->x = i;
  10. delete a;
  11. }
  12. std::cout << std::endl;

这段代码仍然可能输出

  1. 0 0 1 2 3 4 5 6 7 8

除了第一个 0,其余的 0 1 2 3 4 5 6 7 8 都是 flashback 的结果。

在实际的业务逻辑代码中,new 操作可能深埋在复杂代码之中,并且不同对象的 new 操作也会相互影响。

  1. struct A
  2. {
  3. int8_t m1[13];
  4. int x;
  5. };
  6. struct B
  7. {
  8. int8_t m1[13];
  9. int x;
  10. };
  11. // cs1
  12. A* a1 = new A;
  13. a1->x = 66;
  14. delete a1;
  15. // cs2
  16. /*
  17. B* b1 = new B;
  18. b1->x = 22;
  19. delete b1;
  20. */
  21. // cs3
  22. A* a2 = new A;
  23. delete a2;
  24. std::cout << a1 << " " << a2 << " " << std::boolalpha << (a1 == a2) << " " << a2->x << std::endl;

这段代码可能输出

  1. 0x1b05eb0 0x1b05eb0 true 66

成功观测到了 flashback

把 cs2 的注释解开,可能输出

  1. 0x1718eb0 0x1718eb0 true 22

假设 cs2 的执行次数是随机的,或者 b1->x = 22 的 22 是随机的,并且只观测 a1 和 a2 的关系,那么观测到 flashback 的次数也是随机的。

本文来自博客园,作者:mkckr0,转载请注明原文链接:https://www.cnblogs.com/mkckr0/p/15717988.html

原文链接:http://www.cnblogs.com/mkckr0/p/15717988.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号