关于delete的讨论
来源:互联网 发布:php网页自动生成html 编辑:程序博客网 时间:2024/05/22 02:08
争论是由编写自己的容器开始的,其中说到了删除一个元素,到底该怎么做,怎样才算是pop_back了?
老鸟说:只要容器使用者访问不到最后一个元素即可,简单的方法是,把最大元素个数减一,并禁止访问最后一个元素即可。
作为半生瓜蛋子——半路出家者的新鸟,严重以为,必须从内存中删除容器中的对象,才算pop_back。于是就把争议的问题引到了,delete上了。
delete真的删除了内存了吗?答案,两人都说没有,毕竟内存是物理的存在。
老鸟说,不仅没删除,而且可以接着访问,只不过内存中的数据是随机的。
新鸟认为,虽然内存还在,但访问应该是不可以的,因为会出错,举例是自己有过好几次这种经验。毕竟就算内存不涉及硬件的实际内存,至少对应的存储映射应该没了。
好较真的菜鸟,当然不会对谁说的话信服,除非能证明出来。所以动手写了一个小程序,证明自己的说法是正确的。
结果在vs2013上运行错误。于是新鸟认为他是正确的了。然而,linux上,这个程序却是正确的,不存在编译错误,程序也不会死掉。
到底那个正确,还是真的linux和windows系统底层差别巨大?新鸟以为应该不至于,毕竟都是类unix的东西。那么,剩下的另一个的可能的问题,就是编译器了。
于是接着用MinGW编译了一下,正确,可以运行,结果和linux完全一样!
delete之后,紧接着取值是可以的。只不过内容完全随机。一如老鸟所言。
看来delete还真的并没有删除内存,内存是可取值的,也根本不如想象中的类似MOS管或者单片机里的高阻态——模糊无法取值。
但如果把程序修改成下面这样,删除以后,接着赋值呢?
在windows上运行,取值赋值都不可以!
vs2013自不必说,毕竟delete后,紧接着取值都是不可以的,更何况赋值。MinGM也不可以,弹出程序当掉,查找原因的窗口。
虽然程序死掉,但第三次输出,打印出的依旧是随机值。
而在linux上运行,使用gcc编译,运行正常,并且赋值也是可以的,结果如下:
由此可以大概推出一个答案,那就是,一块堆内存,在delete后,未被系统收回且被其它程序使用之前 是可以访问的,并被系统修改成随机数。一旦被系统收回,或者被其它程序使用,再访问,就会变成非法访问,出错!
- 关于delete的讨论
- 关于C++ delete 与 delete[]的讨论
- 关于new,delete与malloc,free的讨论
- C++中的内存管理——关于new和delete的讨论
- C++的new、delete、new[]、delete[]分析讨论
- 关于checkpoint的讨论
- 关于checkpoint的讨论
- 关于比赛的讨论
- 关于工作流的讨论
- 关于C的讨论
- 关于时钟的讨论
- 关于单元测试的讨论
- 关于引用的讨论
- 关于EventDispatcher的讨论
- 关于DM9000 的讨论
- 关于Map 的讨论
- 关于引用&的讨论
- 关于haskell的讨论
- 阅读笔记(五)
- 【数组4】数组中出现次数超过一半的数字
- poj 2632 Crashing Robots
- tomcat6+redis 的session共享
- 【数组5】最小的K个数
- 关于delete的讨论
- rem布局实现自适应
- 关于python netsnmp模块 snmpwalk工具 timeout参数说明
- 1小时内打造你自己的PHP MVC框架
- Linux-(C)多线程学习(入门)
- Red packet 二分
- 一起写一个 Web 服务器
- HDU 3361 ASCII
- c/c++第二天