当前位置: 首页 > news >正文

8、C++匿名对象和程序运行内存划分段

匿名对象

#include<iostream>
#include<unistd.h> // sleep
using namespace std;// 增加一个概念,匿名对象。只有我这一行会使用这个创建对象,别人不需要使用
// 也就是说这个对象的声明周期只有那么一行
class Person{
public:Person() {cout << "构造函数调用" << endl;}~Person() {cout << "析构函数调用" << endl;}
};int main() {Person(); // 匿名对象,调用完立即析构// 怎么证明声明周期只存在于这一行呢sleep(3); // 睡眠3秒钟Person p; // 普通对象return 0;
}
  • 匿名对象只在当前生效
  • 也就是说明这个对象的声明周期仅仅只有一行

程序运行内存划分段

在程序运行过程中,内存通常被划分为几个不同的区域,每个区域负责存储不同类型的数据。下面是对栈(Stack)堆(Heap)、**数据段(Data Segment)代码段(Code Segment)**的详细解释:


栈(Stack)

  • 存储内容
    • 局部变量(如函数内部定义的变量)
    • 函数调用时的参数
    • 返回地址(用于函数调用返回)
  • 特点
    • 后进先出(LIFO)结构
    • 自动分配和释放内存
    • 空间较小,速度快
    • 由编译器自动管理

堆(Heap)

  • 存储内容
    • 动态分配的内存(如使用 mallocnew 等分配的空间)
  • 特点
    • 空间大但管理复杂
    • 需要手动分配和释放(如 freedelete
    • 生命周期由程序员控制,容易造成内存泄漏或碎片

数据段(Data Segment)

  • 存储内容
    • 全局变量和静态变量(包括初始化和未初始化的)
  • 细分
    • 已初始化数据段:存储已赋初值的全局/静态变量
    • 未初始化数据段(BSS段):存储未赋初值的全局/静态变量
  • 特点
    • 在程序加载时由操作系统分配
    • 生命周期贯穿整个程序运行期

代码段(Code Segment)

  • 存储内容
    • 程序的机器指令(即编译后的可执行代码)
  • 特点
    • 通常是只读的,防止程序修改自身代码
    • 所有线程共享这段内存

当然可以!下面是一道涵盖代码段、数据段、堆、栈、只读数据段等内存区域的综合题目,适合用于理解 C/C++ 程序的内存布局。


请看一下这道题目:分析以下 C 代码的内存分布

请阅读以下 C 语言代码,并回答每个变量或数据项存储在哪个内存区域(代码段、数据段、BSS段(不细分也可以称之为数据段)、堆、栈、只读数据段):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int global_init = 10;
int global_uninit;
const char* const_str = "hello";void func(int param) {int local_var = 5;char local_arr[] = "world";char* heap_str = (char*)malloc(6);strcpy(heap_str, "coder");printf("%s %s %s\n", const_str, local_arr, heap_str);free(heap_str);
}int main() {func(global_init);return 0;
}

🧠 问题:

请指出以下每个变量或数据项所在的内存区域,并简要说明原因:

  1. global_init
  2. global_uninit
  3. "hello"
  4. const_str
  5. param
  6. local_var
  7. local_arr
  8. heap_str
  9. "coder"
  10. func 函数体的代码

✅ 参考答案与讲解:

编号名称所在内存区域说明
1global_init数据段(已初始化)全局变量,已初始化为 10,存储在数据段中
2global_uninitBSS 段全局变量,未初始化,存储在 BSS(Block Started by Symbol)段
3"hello"只读数据段(RO Data)字符串字面量,编译时确定,存储在只读数据段
4const_str数据段(已初始化)全局指针变量,初始化指向只读数据段中的 "hello",本身在数据段
5param栈(Stack)函数参数,作为局部变量压入栈中
6local_var栈(Stack)函数内局部变量,存储在栈中
7local_arr栈(Stack)局部数组,内容为 "world",存储在栈中
8heap_str栈(指针)+ 堆(数据)指针变量本身在栈上,malloc 分配的内存在堆上
9"coder"只读数据段(RO Data)字符串字面量,strcpy 将其内容复制到堆中,但字面量本身在只读段
10func 函数体代码段(Text Segment)函数的机器指令存储在代码段中

🎯 总结要点:

  • 全局变量
    • 初始化的 → 数据段
    • 未初始化的 → BSS 段
  • 局部变量 → 栈
  • 字符串字面量 → 只读数据段
  • 动态分配的内存 → 堆
  • 函数代码 → 代码段
http://www.dtcms.com/a/467427.html

相关文章:

  • 并行 Agent:大模型 Scaling 的下一程,从“单打独斗”到“千军万马”
  • 权重域名做网站有用么创意设计团队
  • 南阳做网站公司哪家好企业门户网站模板 下载
  • 吴军-行动指南
  • 南宁网站开发培训santino wordpress
  • 31.渗透-.Kali Linux优化-切换镜像源(设置中文,更新软件,更新数据库)
  • 怎么上传自己做的网站新加坡房产网站大全
  • 抚州网站建设景区网站建设教程
  • 【除1和自身最多因子输出最小的不用数组】2022-11-28
  • 拍卖网站模板下载网站做可信认证多少钱
  • 网站优化任务优设网官网首页
  • 做的比较好的企业网站做网站就来厚博互联
  • 泸溪县建设局网站新都区网站建设
  • 做网站主要学什么条件淄博市住房和城乡建设局网站
  • 模仿建设银行网站黄冈网站建设 网络推广
  • 无油樟(Amborella trichopoda)T2T基因组--文献精读165
  • 做农业需关注什么网站wordpress主题谁的最好
  • 100m做电影网站网站项目团队介绍怎么写
  • 商城网站jq楼层响应动画师工资一般多少
  • 中企业网站建设免费素材网站 可商用
  • 网站建立于网页设计wordpress留学主题
  • 织梦猫html5高端网络服务机构网站模板上传文件生成链接下载
  • 舆情处置的智能化进阶:Infoseek舆情系统如何构建企业数字免疫体系
  • 手机如何制作一个网站html制作个人简历
  • AI大事记11:从 AlphaGo 到 AlphaGo Zero(上)
  • 有关于网站开发的参考文献网络推广怎么学
  • 【展厅多媒体】解析互动滑轨屏推动数字展厅智能化升级
  • 开源门户网站cmswordpress主题放哪
  • 谷歌推广网站做网站设计都需要什么软件
  • MySQL 多表查询中,联合查询(UNION) 和子查询