代码区(别人写的一个测试用例) 2011-12-9 14:50
2013-01-17 10:00
197 查看
首先看:
class TestMem{
public:
char m_char;
int m_iMember;
int m_iMember2;
TestMem()
{
m_iMember = 1;
m_iMember2 = 2;
}
int Print()
{
printf("print in Print!\n");
return 0;
}
};
int main(int argc, char* argv[])
{
int iSize = sizeof(TestMem);
printf("class size:%d\n", iSize);
return 0;
}
此处输出的是12,类的成员函数并没有在计算的大小之内,因为成员函数在编译后存放在内存的代码区。
typedef int(TestMem::*MEMFUN)();
TestMem *p = new TestMem;
MEMFUN pPrint = p->Print;
MEMFUN pPrint2 = p->Print2;
GOLBAL pStatic = TestMem::Print_Static;
printf("p->Print: %p\t p->Print: %p\t TestMem::Print_Static: %p\n", pPrint, pPrint2, pStatic);
delete p;
p = 0;
p->Print();
printf("after delete :%p\n", p);
通过以上代码可以打印出成员函数的地址,在调用成员函数的时候,编译器会在编译时决议出正确的普通成员函数地址,并将对象的地址以this指针的方式,做为第一个参数传递给普通成员函数,以此来进行关联。
但是在delete p之后,调用p->Print() ,如果再Print中没有使用类成员对象,是可以正常运行的。
不知道该怎么理解?试了一下
TestMem *ptr = (TestMem*)(0);
ptr->Print();
也是可以正常输出的,不知道编译器对于代码区具体的管理[/u]方式,应该是根据类成员函数的偏移量来决定,如果Print()中没有调用类成员对象,Print作用相当于全局函数。
编译器为VC 6.0,还没在GCC中试。
转载自:http://space.itpub.net/10945710/viewspace-662273
class TestMem{
public:
char m_char;
int m_iMember;
int m_iMember2;
TestMem()
{
m_iMember = 1;
m_iMember2 = 2;
}
int Print()
{
printf("print in Print!\n");
return 0;
}
};
int main(int argc, char* argv[])
{
int iSize = sizeof(TestMem);
printf("class size:%d\n", iSize);
return 0;
}
此处输出的是12,类的成员函数并没有在计算的大小之内,因为成员函数在编译后存放在内存的代码区。
typedef int(TestMem::*MEMFUN)();
TestMem *p = new TestMem;
MEMFUN pPrint = p->Print;
MEMFUN pPrint2 = p->Print2;
GOLBAL pStatic = TestMem::Print_Static;
printf("p->Print: %p\t p->Print: %p\t TestMem::Print_Static: %p\n", pPrint, pPrint2, pStatic);
delete p;
p = 0;
p->Print();
printf("after delete :%p\n", p);
通过以上代码可以打印出成员函数的地址,在调用成员函数的时候,编译器会在编译时决议出正确的普通成员函数地址,并将对象的地址以this指针的方式,做为第一个参数传递给普通成员函数,以此来进行关联。
但是在delete p之后,调用p->Print() ,如果再Print中没有使用类成员对象,是可以正常运行的。
不知道该怎么理解?试了一下
TestMem *ptr = (TestMem*)(0);
ptr->Print();
也是可以正常输出的,不知道编译器对于代码区具体的管理[/u]方式,应该是根据类成员函数的偏移量来决定,如果Print()中没有调用类成员对象,Print作用相当于全局函数。
编译器为VC 6.0,还没在GCC中试。
转载自:http://space.itpub.net/10945710/viewspace-662273
相关文章推荐
- 一种奇怪的错误,执行一个junit测试用例,代码却执行了很多遍
- 编写一个JPA测试用例
- 一个登录的自动化测试用例(新手)
- C#设置程序开机自启动,代码别人的,没有经过测试
- 测试用例顺序执行时,若上一个用例未退出iframe,下一个测试用例默认需要一次退出iframe,否则定位iframe出现错误
- 一个纸杯的测试用例
- 一个 Makefile 实例,用于编译各多个子目录测试代码
- robotium 在有源代码的情况下 写测试用例无法编译通过,生成apk。
- 测试Tomcat是否成功的一个测试代码(部分)
- POJ 1001-Exponentiation,测试用例及本人未优化代码
- selenium2java一个弹框上传时间日期大杂烩测试用例
- 一个详细测试用例的文档
- 今天根据别人的代码简单的封装了一个将java bean生成xml的一个工具类,运用了反射和泛型,重用性高。
- Android test---CTS---添加一个新的测试用例
- 什么是测试用例和测试规程,设计一个测试用例应当从哪几方面考虑?
- 一个纸杯的测试用例
- 一个robotium的测试代码
- 使用Junit测试一个 spring静态工厂实例化bean 的例子,所有代码都没有问题,但是出现java.lang.IllegalArgumentException异常
- 设计一个算法移除字符串中的重复字符,并写出测试用例。
- 一个新手为老代码写测试程序的心得