关于AEEClsCreateInstance中nSize的奇怪问题

AEEClsCreateInstance函数的功能是用来创建接口类,具体可以见Blog中《开发BREW扩展类》一文。在该函数的实现代码中,有一个奇怪的nSize,他是需要创建的接口类申请空间的大小,但是代码中对于该nSize的赋值十分有意思,对于以下的分析比较合理,贴出来分享一下。

转自:http://expert.imobile.com.cn/bbs

作者:东方欲晓

if(nSize < sizeof(ExtensionCls))

nSize += sizeof(ExtensionCls);
if((pMe = (ExtensionCls *)MALLOC(nSize +
sizeof(VTBL(IExtensionCls)))) == NULL )
return ENOMEMORY;

ExtensionCls是用户定义的class结构,所以创建的内存nsize至少应该等于这个,
if(nSize < sizeof(ExtensionCls))

nSize += sizeof(ExtensionCls);
是进行合理性检查,防止传入的size不合理(小于class的大小),如果不合理则在nsize的基础上加一个完整的class的内存大小,保证能正常创建class(通常传入的nsize就是sizeof(appclass),所以这一句不会走)
pMe = (ExtensionCls *)MALLOC(nSize +
sizeof(VTBL(IExtensionCls))))

进行真正的内存分配,此时除了给class分配内存外,还要为vtbl分配内存,所以分配的大小为nSize +
sizeof(VTBL(IExtensionCls))

这样分配完后,在内存中,class之后就紧接着是一块vtbl区域,接着代码中会为这块vtbl区域初始化,即将其函数指针指向确切的函数地址,最后再将class中的pvt指针指向该vtbl,从而完成了整个class的初始化。

你可能感兴趣的:(5,BREW开发)