【VS】关于内存分布查看的方式

本文通过两个C++类的实例,展示了如何使用Visual Studio的编译器选项来查看类的内存布局,并介绍了基类与派生类的构造与析构过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


class Base
{
public:
	int a;
	Base()
	{
		cout<<"Base()"<<endl;
	}
	~Base()
	{
		cout<<"~Base()"<<endl;
	}
	virtual fun()
	{
		cout <<"Base fun()"<<endl;
	}
};

class Derived:public Base
{
public:
	Derived()
	{
		cout<<"Derived()"<<endl;
	}
	~Derived()
	{
		cout<<"~Derived()"<<endl;
	}
};





选择项目属性 C/C++  命令行  附加选项   添加  /d1 reportAllClassLayout  则会打印所有的内存信息。。

/d1 reportSingleClassLayoutBase 则是打印单个类的内存信息。。


F7 编译时,选择输出窗口,生成  如下图:






### 如何使用 GDB 查看进程内存分布 #### 使用 GDB 的基本方法 GDB 是 GNU 调试器,用于调试 C 和 C++ 程序。它提供了多种功能来查看程序运行时的状态,其中包括内存布局分析。通过加载目标文件并设置断点,可以深入观察变量、寄存器以及堆栈的内容。 为了查看进程内存分布,可以通过以下方式实现: #### 加载目标文件和启动调试会话 首先需要编译带有调试信息的目标文件(通常使用 `-g` 编译选项)。之后,在终端中输入 `gdb ./program_name` 启动调试工具[^1]。 #### 设置断点并运行程序 在特定位置设置断点以便暂停程序执行,从而进一步检查其状态。例如: ```bash break main run ``` 当程序停止于指定断点处时,即可开始探索当前上下文中可用的各种数据结构及其存储地址范围。 #### 探索内存区域 ##### 堆栈(Stack) 利用命令如 `info frame`, 可获取关于活动帧的信息;而借助 `bt`(backtrace), 则能展示完整的函数调用链表。这些操作有助于理解局部变量是如何分配到栈上的[^2]. ##### 数据段(Data Segments) 对于静态定义的数据成员或者全局/外部链接的对象来说, 它们会被放置在一个叫做“.data”的节区里(如果已经被初始化),或者是".bss"(未被显式赋初值)[^3]. 你可以直接访问某个具体符号对应的物理位置: ```bash print &variable_name ``` 这将返回该变量所在的具体RAM偏移量. 另外还可以尝试读取连续字节数组形式表示的一片区域内的内容: ```bash x /nfu address-expression ``` 其中 n 表示数量,f u分别代表格式化输出类型(unit size)与单位大小(byte count). 例如下面的例子展示了如何显示从数组起始位置开始往后数8个整型数值的情况. ```bash x /8dw data ``` #### 动态分配(Dynamic Allocation) 针对那些由new/malloc创建出来的动态实例,则需依赖指针间接寻址机制去定位实际占据的空间边界. 此外值得注意的是, 当释放掉某块资源后再次试图对其进行任何非法操作均可能导致不可预期的结果发生, 所以务必谨慎对待已经free'd/freeing中的实体.[^2] --- ### 示例代码片段说明 考虑这样一个简单的C源码例子[^4]: ```c #include <stdio.h> int main(void){ int i=0; char data[100]={0}; for(i=0;i<(sizeof(data)/sizeof(char));i++){ data[i]=i; } return 0; } ``` 在此基础上我们可以按照上述指导原则逐步剖析整个应用程序生命周期内所涉及的不同种类存储单元之间的相互关系.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值