4345|10

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

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

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

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

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

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

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

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

最新回复

我试了一下,NEW一个对象,调DELETE两次,再调这个对象的方法,的确没事,但是如果你再NEW另外一个对象,有可能会出现问题。  详情 回复 发表于 2009-5-17 07:34
点赞 关注

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

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

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

这也就是CE为什么不Crash,而桌面系统会Crash的原因。
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是容易产生内存碎片
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
就是实现的规则不同ba
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
顶,只能顶了。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
wince几啊? wince6以前的版本跟桌面windows还是有很大的差别的。
可能内存是被回收了,但是那段内存可能还并没被覆盖或清零。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
我用的CE是4.0

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

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

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

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
没有研究过,帮顶一下
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
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
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
delete 是由你来实现回收的
WinCE精简了很多东西
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

11
 
我试了一下,NEW一个对象,调DELETE两次,再调这个对象的方法,的确没事,但是如果你再NEW另外一个对象,有可能会出现问题。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表