生死疆界(下)--- 在new与delete之间2011-04-12土豆上回《生死疆界(上)》说到: 咱们对着微软在背后做的手脚深感困惑,于是备好车马粮草 ,一路追杀进去,最后走进了死胡同,剩下的最后希望就是在这里摸摸,那里敲敲,看有没 有暗藏机关。这正是:探源码身陷绝境,求解脱心系参数。还记得我们在delete p;前设的断点吗?好,让我们重新开始调试,按F5,从控制台输入 "abcd",然后到这条语句前停止了,查看变量p的值,是0x00342c40,那好,打开 vc监视内存的窗口memory,我们查看这个地址的值:

此后的内存情况不再用图片显示。只用红色标志的内存表示发生了变化的内存看到了吗?你的宝贝"abcd"乖乖地躺在内存中,其后跟了一个0x00,那表 示"" "",字符串结束标志。一切都很正常,到底哪里出错了?难道是delete p用错了,而应 该用delete[] p?try it,你会发现依然有相同的错误。从这段内存中仍然看不出问题,仿佛一切风平浪静,其实是我们来晚了,在delete p前, 内存早已经发生了翻天覆地的变化。 再一次重新进入程序,这次我们从一开始就监视内存。00342C40 EE FE EE FE EE FE EE 铪铪铪.00342C47 FE EE FE EE FE EE FE .这是char *p = new char,执行前的内存。下面是执行后的:00342C40 CD FD FD FD FD F0 AD 妄.00342C47 BA 0D F0 AD BA 0D F0 ..瓠...看不出什么问题,再往下执行吧:(cin>>p, 这次我们输入ab)00342C40 61 62 00 FD FD F0 AD ab.瓠00342C47 BA 0D F0 AD BA 0D F0 ..瓠...ab正确地放进了内存中,而且你可以看到cin还体贴地在ab后为你放了一个"" ""