BUIW 里面的一个BUG!

lijiangyun 2009-06-30 09:03:53
最近研究BUIW,发现里面存在的一个bug:

函数 ImageStaticWidget_New 里面这一行:

ImageStaticWidget *me = MALLOCREC_VTBL(ImageStaticWidget, IWidget);

这里分配内存的虚表应该是 IPropContainer 而不是 IWidget,因为Container

作为一个 Widget,虚表是不需要分配内存的,其成员 vtWidget 用来保存Widget

的虚表,而需要分配内存的是 IContainer 的虚表;

这样一个bug为什么不会出现问题呢?原因就是 IWidget 虚表大于 IContainer 虚表,

分配出来的内存足以存放 IContainer 虚表,因此除了一点内存浪费,不会出现其他问题!

应该改为:

ImageStaticWidget *me = MALLOCREC_VTBL(ImageStaticWidget, IPropContainer);
...全文
1294 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxfcct 2009-11-24
  • 打赏
  • 举报
回复
楼主是高手啊,这个问题我也发现了
nihao38 2009-11-20
  • 打赏
  • 举报
回复
iBug168 2009-11-08
  • 打赏
  • 举报
回复
...这个算是BREW的一个继承机制吧...
呵呵,要不然quereinterface的对象如何出来??

IWIDGET_QueryInterface(_pi_widget, AEEIID_CONTAINER, &pi_con),
IPROPCONTAINER_QueryInterface(_pi_con, AEEIID_WIDGET, &pi_widget),

LZ可以思考思考上面两组接口的实现,当然这只是qualcomm的一种实现方式而以.
twoconk 2009-10-09
  • 打赏
  • 举报
回复
楼主真细心!
bencharluo 2009-09-29
  • 打赏
  • 举报
回复
正在学习,多和大家讨论
FLYUP_CHEN 2009-09-02
  • 打赏
  • 举报
回复
最近也在看,还在研究中。。。
alex_goacross 2009-08-21
  • 打赏
  • 举报
回复
lijiangyun !正解!!!
muwesky 2009-08-16
  • 打赏
  • 举报
回复
汗,仔细研究一下去,呵呵。
jungwen 2009-08-16
  • 打赏
  • 举报
回复
我感觉楼主有道理,但是BUIW的每个Widget类都是这样分配的,汗,莫非都有错误?
givenup 2009-07-01
  • 打赏
  • 举报
回复
奥,继续学习……
lijiangyun 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wireless_com 的回复:]
ImageStaticWidget 我用的好好的呀
[/Quote]

我上面说过了,这个bug不会出现问题,只是有内存浪费!但是这确实是一个bug!
  • 打赏
  • 举报
回复
ImageStaticWidget 我用的好好的呀
lijiangyun 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 givenup 的回复:]
我感觉并没有错误啊,IMAGESTATICWIDGET虽然实质是propcontainer,但是它的虚拟表还是要指向AEEWIDGET.H中所有的那些基本的
widget的函数啊!
继续研究!
[/Quote]

Container 是一个特殊的 Widget, 它支持 IWidget 虚表函数,也支持 IContainer 虚表函数,看 ContainerBase 的定义:

struct ContainerBase
{
AEEVTBL(IContainer) * pvt;

IWidget widget;
AEEVTBL(IWidget) vtWidget;

...
}

vtWidget 用来保存 IWidget 虚表,它是一个结构体而不是指针,即内存不需要分配;
pvt 用来保存 IContainer 虚表,它是一个指针,需要分配内存;

因此 Container 组件在创建的时候,分配虚表内存是给 pvt 分配的,而不是 vtWidget!

givenup 2009-06-30
  • 打赏
  • 举报
回复
我感觉并没有错误啊,IMAGESTATICWIDGET虽然实质是propcontainer,但是它的虚拟表还是要指向AEEWIDGET.H中所有的那些基本的
widget的函数啊!
继续研究!
  • 打赏
  • 举报
回复
有道理,的确如此

1,107

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧