文章分类 - 【003】反汇编代码搜集
摘要:一、调用无参构造函数代码如下:(在类中实例化另一个类) 1 #include<iostream> 2 #include <string> 3 4 5 using namespace std; 6 7 class StudentID 8 { 9 int value;10 public:11 StudentID()12 {13 static int nextStudentID = 0;14 value = ++nextStudentID;15 cout<<"Assigning student id "<<value <<
阅读全文
摘要:问题:虚表指针什么时候会被使用?答:这种通过虚表间接寻址访问的情况只有在使用对象的指针或引用来调用虚函数时候才会出现。(是以避免以后出现子类覆盖父类虚函数时,使用父类引用调用虚函数产生的多态性)当直接使用对象调用自身的虚函数时,没有必要查表访问。这事因为已经明确调用的是自身成员函数,根本没有构成多态性,查询虚表只会画蛇添足,降低程序执行效率,所以将这种情况处理为直接调用方式。而使用指针或引用,因为不知道要调用的虚函数的地址,就只能使用虚表指针间接寻址!个人总结:1、没有继承父类的子类(因为没有父类,也可以把自己看成父类)实例化以后,通过引用或指针调用虚函数的时候,才会使用虚表指针间接访问虚函数
阅读全文
摘要:主要参考文章:http://blog.csdn.net/haoel/article/details/3081328参考书籍:《c++反汇编与逆向分析技术揭秘》针对最后一个程序分析,-4的缘由,参考评论:该地址所指向的内存地址中,第一项为,该该所属类的虚拟指针 相对于 该地址的偏移值;第二项,保存的是父类虚表指针相对该地址的偏移值!!!文章:http://hi.baidu.com/hj11yc/item/0428b1ba2c7e8aadeaba93b3有对-4做出解答...(可是我还是不很理解...)
阅读全文
摘要:之所以有默认拷贝构造函数、深拷贝构造函数,就是因为对象在作为函数参数时,对象在内存中的数据如何进行传递而产生的。先看一段带代码: 1 #include <iostream> 2 using namespace std; 3 4 class Person 5 { 6 char *pName; 7 public: 8 Person(char *pN) 9 {10 cout<<"Constructing "<<pN<<endl;11 pName = new char[strlen(pN)+1];12 if(pName)13 ...
阅读全文
摘要:一、简单区分:" 基类中有个 void fun(){},派生类中也用void fun(){};" 和 "基类中有个 virtual void fun(){},派生类中用void fun(){};" 它们有差别,这些差别主要体现在多态上。前者 表明基类中的函数被派生类函数覆盖了,它们几乎没有关联,在C++中就是两个完全不同的函数,只不过恰巧名字一样而已(但有不同的类作用域),就像在不同的作用域定义了两个相同名字的变量。 int a; //类似基类中的fun() namespace { int a; //类似派生类中的fun(),作...
阅读全文
摘要:一、结构体与类 C++中,结构体和类都具有构造函数、析构函数和成员函数。 区别:结构体的访问控制默认为public,而类的默认访问控制是private。 特点:对于C++中的结构体而言,public、private、protected的访问控制都是在编译器进行检查,当越权访问时,编译过程中会检查出此类错误并给予提示。编译成功后,程序在执行的过程中不会在访问控制方面做任何检查和限制。 因此,反汇编中,C++中的结构体与类没有分别,两者的原理相同,只是类型名称不同。二、对象的内存布局 类的实例化对象都存放在堆中!!!!(可以通过反汇编实例化代码,可知实例的首地址一般都在堆中) 对象的大...
阅读全文
摘要:这是一段简单的代码,就一个数是否为奇偶的片段1 int main()2 {3 int num ;4 scanf("%d",&num);5 num = num % 2; // 这里求%2的模6 printf("%d",num);7 return 0;8 }反汇编代码如下:.text:00401000 _main proc near ; CODE XREF: start+AFp.text:00401000.text:00401000 var_4 = dword ptr -4.text:...
阅读全文