这两天发现Android中java上层传递下来的ISurface,我在底层居然画不出图像,但是如果我在底层自己创建ISurface却是可以的...
这让我和我同事纠结无比,四处找原因...
由于这个现象很像是因为上层传递下来的ISurface并不是上层所管理的那一个...所以我把怀疑方向放在了接口传递参数的时候...当然了,现在看来我所遇到的这个问题并非接口传递参数导致的.
其中很多地方有返回sp<T>& 的函数调用,并且返回值又是一个强制类型转换的结果,所以我不得不细细研究了一下引用.
#include <stdio.h>
#include <stdlib.h>
const int& func(int &dd) {
printf("dd=%d,dd:0x%08x\n",dd,&dd);
const int& tt = (int)dd;
printf("tt=%d,tt:0x%08x\n",tt,&tt);
return tt;
}
int main() {
int d =20;
const int &p = func(d);
printf("p=%d,p:0x%08x\n",p,&p);
return 0;
}
运行结果:
dd=20,dd:0xbf979850
tt=20,tt:0xbf979820 //这里地址就不一样了!
p=20,p:0xbf979820
果然证实了强制类型转换会产生临时变量的说法...但是传指针就不会有这样的问题,包括指针的引用也不会
传指针
#include <stdio.h>
#include <stdlib.h>
const int* func(int *dd)
{
printf("dd=%d,dd:0x%08x\n",*dd,dd);
int* const tt = (int*)(dd);
printf("tt=%d,tt:0x%08x\n",*tt,tt);
return tt;
}
int main() {
int d =20;
int *pt = &d;
const int *p = func(pt);
printf("p=%d,p:0x%08x\n",*p,p);
return 0;
}
运行结果:
dd=20,dd:0xbf9a3880
tt=20,tt:0xbf9a3880
p=20,p:0xbf9a3880
传指针的引用
#include <stdio.h>
#include <stdlib.h>
typedef int* int_p;
const int_p& func(int_p& dd)
{
printf("dd=%d,dd:0x%08x\n",*dd,dd);
const int_p& tt = (int_p)(dd);
printf("tt=%d,tt:0x%08x\n",*tt,tt);
return tt;
}
int main()
{
int d =20;
int_p pt = &d;
const int_p &p = func(pt);
printf("p=%d,p:0x%08x\n",*p,p);
return 0;
}
运行结果:
dd=20,dd:0xbfa23100
tt=20,tt:0xbfa23100
p=20,p:0xbfa23100