千家信息网

C/C++的内存管理怎么理解

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章的内容主要围绕C/C++的内存管理怎么理解进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!C/C++内
千家信息网最后更新 2026年11月02日C/C++的内存管理怎么理解

这篇文章的内容主要围绕C/C++的内存管理怎么理解进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!

    C/C++内存分布

    int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = {1, 2, 3, 4};char char2[] = "abcd";char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof (int)*4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);free (ptr1);free (ptr3);}

    习题

    1. 选择题:  选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)  globalVar在哪里?__C__  staticGlobalVar在哪里?__C__  staticVar在哪里?__C__  localVar在哪里?__A__  num1 在哪里?__A__    char2在哪里?__A__   *char2在哪里?_A__  pChar3在哪里?_A___   *pChar3在哪里?__D__  ptr1在哪里?__A__    *ptr1在哪里?__B__2. 填空题:(32位程序)  sizeof(num1) = __40__;    sizeof(char2) = __5__;   strlen(char2) = __4__;  sizeof(pChar3) = __4__;   strlen(pChar3) = __4__;  sizeof(ptr1) = __4__;

    1.堆又叫堆栈,非静态局部变量、函数参数、返回值等等,栈是向下增长的。

    2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。

    3.堆用于程序运行时动态内存分配,堆是可以向上增长的。

    4.数据段 – 存储全局数据和静态数据。

    5.代码段 – 可执行的代码/只读常量

    C语言中动态内存管理方式

    malloc, calloc, realloc 的区别?

    calloc 会初始化, 相当于 malloc + memset, 按字节初始化,空间每个字节都初始化为0。
    realloc扩容,分为原地扩,异地扩。

    C++ 内存管理方式

    申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]。

    int* p1 = new int(5);

    动态申请一个int空间,这块空间初始化为5.

    int* p2 = new int[5];

    动态申请5个int空间。

    int* p3 = new int[5]{1,2,3,4,5};

    给上初始值

    new和delete操作自定义类型

    在申请自定义类型的空间时,new 会调用构造函数, delete 会调用析构函数,而 malloc 与 free 不会。

    operator new 与 operator delete函数

    new 和 delete 是用户进行 动态内存申请 和释放的操作符, operator new 和 operator delete 是系统提供的全局函数。
    new 在底层调用operator new全局函数来申请空间,delete 在底层通过operator delete全局函数来释放空间。

    • operator new :该函数通过 malloc 来申请空间,当 malloc 申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则就行申请,否则 跑异常。

    • operator delete:该函数最终是通过free来释放空间的。

    new和delete的实现原理

    1.内置类型

    如果申请的是内置类型的空间, new 和 malloc, delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间。

    new[] 和 delete[] 申请的是连续空间,而且new在申请空间失败时会抛异常, malloc 会返回 NULL。

    2.自定义类型

    • new原理

    1.调用 operator new 函数申请空间

    2.在申请的空间上执行构造函数,完成对象的构造。

    • delete的原理

    1.在空间上执行析构函数,完成对象中资源的清理工作。

    2.调用 operator delete 函数释放对象的空间。

    • new T[N]的原理

    1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请

    2.在申请的空间上执行N次构造函数

    • delete[]的原理

    1.在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理

    2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

    malloc/free和new/delete的区别

    malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。

    不同的地方是:

    1.malloc和free是函数,new和delete是操作符

    2.malloc申请的空间不会初始化,new可以初始化

    3.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可

    4.malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

    5.malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

    6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

    C语言是什么

    C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储器。

    感谢你的阅读,相信你对"C/C++的内存管理怎么理解"这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注网站!小编会继续为大家带来更好的文章!

    空间 函数 内存 对象 类型 动态 原理 语言 管理 全局 数据 方式 用户 代码 底层 操作符 程序 资源 静态 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 苏州找大状互联网科技有限公司 厦门中拓互联网络科技有限公司 盈实互联网科技 有马互联网科技 四川狮子座互联网科技 江苏南京365互联网科技 福州新华互联网科技学校 知乎 成都互联网科技公司100强 语蝶互联网科技有限公司 杭州壁岐互联网科技有限公司 国大互联网教育科技有限公司工作 互联网科技人工智能实验室 华夏恒生科技与互联网科技 明优互联网科技有限公司 互联网数据科技专业 互联网营销推广黑科技 唯美互联网科技 互联网金融金融科技 互联网科技创新方面的资料 前海云享互联网科技 深圳九邦互联网科技有限公司 互联网科技工作委员会毛军 互联网的科技 互联网通讯科技 富国互联网科技创新基金 小米互联网科技园设置 想开互联网科技公司怎么样 允成互联网科技有限公司融资 互联网科技公司营业执照怎么办理 山东星卡互联网科技有限公司官网
    0