关于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后,未被系统收回且被其它程序使用之前 是可以访问的,并被系统修改成随机数。一旦被系统收回,或者被其它程序使用,再访问,就会变成非法访问,出错

0 0
原创粉丝点击