目的
对c++对象的内存布局有点迷糊,学习之中简单记录一下,以便复习查阅。
环境:
g++:g++ (Ubuntu 8.3.0-16ubuntu3~16.04) 8.3.0
一. 示例1
存在一个类,包含有三个虚函数,分别打印不同的字符串。在main.cpp
函数中定义一个类的示例对象,通过分析示例对象的信息,达到学习的目的。
#include <iostream>
using namespace std;
// 定义一个基类
class CBase
{
public:
virtual void f1() const { cout << "f1" << endl; }
virtual void f2() const { cout << "f2" << endl; }
virtual void f3() const { cout << "f3" << endl; }
};
// 调用函数
int main()
{
cout << "定义一个基类b" << endl;
CBase pBase;
return 0;
}
编译脚本:
CC=g++
CXXFLAGS=-std=c++11 -g
OBJ=main.o
SRC=
edit:main.o
$(CC) $(CXXFLAGS) -o main $(OBJ)
main.o:$(SRC)
$(CC) $(CXXFLAGS) -c main.cpp
.PHONY:clean
clean:
rm -rf main $(OBJ)
编译启动调试,断点到main.cpp
的CBase pBase;
行,运行程序。在开始调试之前我们需要设置一下gdb的调试输出,方便我们查看:
set print object on
set print vtbl on
set print pretty on
再输入r
开始运行,如下:
运行到断点处,使用p pBase
(print
)查看示例对象的信息:
pBase示例对象包含有虚表指针_vptr.CBase
,地址为:0x7fffffffde10
输入info vtbl pBase
查看示例对象pBase
的虚函数表内容:
CBase的虚表中包含有三个虚函数的指针,分别对应的是[0],[1],[2]
若使用微软的编译工具则看的更加明显: