高分求助:WinCE下,删除一个对象,然后再调用该对象的方法,为啥不Crash???

cnt   2009-5-15 21:02 楼主
最近调试WinCE下的一个问题。有一个现象,百思不得其解。详述如下:
Class A
{
.......
  void destroy()
  {
     delete this;
  }
.......
}

也就是说,类有一个Destroy方法,在对象不再使用时删除自身。理论上讲,当对象删除后,内存也应该被释放回收。

当时我的代码出了一点问题,导致这个destroy()被调用了两次。按理说,第二次调用destroy时,application应该Crash才对啊,可是在WinCE下,居然不crash,一切正常。

我把同样的逻辑放到XP上运行,马上就Crash了!

我一直没想明白,按理说第二次调用destroy时,是访问一个已经被删除的对象啊,可是为啥不出错?XP上的表现才合乎逻辑啊。

这个WinCE究竟是怎么搞的???

欢迎大家前来讨论!分不够再加,我就是想把这个问题弄明白。

回复评论 (10)

理论上讲,当对象删除后,内存也应该被释放回收。  

这个理论只有桌面系统才有,CE没有回收内存的功能。CE的内存管理比较简单,容易安装内存碎片,因为CE不回收被释放的内存。当 内存不足时,重新从Heap起始处查找可用于分配的内存。所以一内存被释放时,在CE下这块内存区域还是存在的,除非被以后的分配占用了。

这也就是CE为什么不Crash,而桌面系统会Crash的原因。
点赞  2009-5-17 09:57
是容易产生内存碎片
点赞  2009-5-17 10:03
就是实现的规则不同ba
点赞  2009-5-15 21:18
顶,只能顶了。。
点赞  2009-5-15 22:56
wince几啊? wince6以前的版本跟桌面windows还是有很大的差别的。
可能内存是被回收了,但是那段内存可能还并没被覆盖或清零。
点赞  2009-5-16 09:21
我用的CE是4.0

楼上的Paul的解释好像回答了我的问题,但我还是不是十分的确信和明白。

我怀疑楼上的是台湾同胞吧? 呵呵

还有没有人对这个问题有研究?都发表发表看法吧!

点赞  2009-5-16 20:24
没有研究过,帮顶一下
点赞  2009-5-16 08:53
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
点赞  2009-5-16 10:02
delete 是由你来实现回收的
WinCE精简了很多东西
点赞  2009-5-17 03:51
我试了一下,NEW一个对象,调DELETE两次,再调这个对象的方法,的确没事,但是如果你再NEW另外一个对象,有可能会出现问题。
点赞  2009-5-17 07:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复