最近调试WinCE下的一个问题。有一个现象,百思不得其解。详述如下:
Class A
{
.......
void destroy()
{
delete this;
}
.......
}
也就是说,类有一个Destroy方法,在对象不再使用时删除自身。理论上讲,当对象删除后,内存也应该被释放回收。
当时我的代码出了一点问题,导致这个destroy()被调用了两次。按理说,第二次调用destroy时,application应该Crash才对啊,可是在WinCE下,居然不crash,一切正常。
我把同样的逻辑放到XP上运行,马上就Crash了!
我一直没想明白,按理说第二次调用destroy时,是访问一个已经被删除的对象啊,可是为啥不出错?XP上的表现才合乎逻辑啊。
这个WinCE究竟是怎么搞的???
欢迎大家前来讨论!分不够再加,我就是想把这个问题弄明白。
理论上讲,当对象删除后,内存也应该被释放回收。
这个理论只有桌面系统才有,CE没有回收内存的功能。CE的内存管理比较简单,容易安装内存碎片,因为CE不回收被释放的内存。当 内存不足时,重新从Heap起始处查找可用于分配的内存。所以一内存被释放时,在CE下这块内存区域还是存在的,除非被以后的分配占用了。
这也就是CE为什么不Crash,而桌面系统会Crash的原因。
wince几啊? wince6以前的版本跟桌面windows还是有很大的差别的。
可能内存是被回收了,但是那段内存可能还并没被覆盖或清零。
我用的CE是4.0
楼上的Paul的解释好像回答了我的问题,但我还是不是十分的确信和明白。
我怀疑楼上的是台湾同胞吧? 呵呵
还有没有人对这个问题有研究?都发表发表看法吧!
1. new, delete 操作及 malloc 等 function 都是对 heap 操作, 并不是每次都去向 OS 要 memory.
2. 对一般 OS 而言, 为了 memory allocation 的效率, 故其 heap 的 allocation 都是一次要一定的数量, 故有些 new-delete 的操作, 只是 heap 的剩馀空间变化, 对 OS 管理的 memory 是没有影响的.
3. 以 LZ 的例子而言, 只是 HEAP 内的风暴, 故 OS 不会发现, 至於会不会 crash, 则端看该 memory 是否有被配置, 或是改变後会不会对程式流程影响.
4. WindowsCE & desktop Windows 只是 API (都称为 Win32 API) 相容 (compatible), 故呼叫这些 api 时参数个数与型态皆相同, 但该 api 实作的细节却不一定相同, 这点 LZ 必须注意.
5. 对 heap 的解释, 可参考 http://msdn.microsoft.com/en-us/library/bb202725.aspx
Paul, Chao @ Techware
delete 是由你来实现回收的
WinCE精简了很多东西
我试了一下,NEW一个对象,调DELETE两次,再调这个对象的方法,的确没事,但是如果你再NEW另外一个对象,有可能会出现问题。