资讯动态

【C/C++】 内存管理详解

发布时间:2026/9/3 9:13:52 来源:尧图企业网站定制
铅笔小新z个人主页博客专栏C学习滴水不绝可穿石步履不休能至渊。C/C 内存管理详解从入门到面试必备大家好今天我们来聊聊 C/C 中的内存管理这是一个初学者容易迷糊、面试官又特别喜欢问的话题。内存管理理解好了不仅能写出更稳定、更高效的程序还能在面试中脱颖而出。我会尽量用大白话讲清楚咱们一步步来。一、C/C 程序的内存布局我们先来看一个例子intglobalVar1;// 全局变量staticintstaticGlobalVar1;// 静态全局变量voidTest(){staticintstaticVar1;// 静态局部变量intlocalVar1;// 局部变量intnum1[10]{1,2,3,4};// 局部数组charchar2[]abcd;// 局部字符数组constchar*pchar3abcd;// 常量字符串指针int*ptr1(int*)malloc(4*sizeof(int));// 动态分配}这些变量分别存在哪里呢globalVar、staticGlobalVar、staticVar→数据段静态区localVar、num1、char2→栈abcd常量字符串 →代码段常量区ptr1指针变量本身 →栈*ptr1指向的内存 →堆内存区域划分图解高地址 → 内核空间用户不可见 ↓ 栈向下增长存放局部变量、函数参数等 ↓ 内存映射段文件映射、动态库、共享内存 ↓ 堆向上增长动态分配内存 ↓ 数据段存放全局变量、静态变量 ↓ 低地址 → 代码段存放可执行代码、常量二、C 语言动态内存管理malloc / calloc / realloc / freeC 语言中动态内存管理靠这四个函数malloc(size)申请指定字节的内存不初始化。calloc(num, size)申请num个大小为size的内存并初始化为 0。realloc(ptr, size)调整已分配内存块的大小可扩大或缩小。free(ptr)释放内存。面试常问malloc / calloc / realloc 的区别答malloc只分配不初始化calloc分配并清零realloc调整已有内存块大小可能移动数据。malloc 的实现原理答glibc 中的malloc使用brk / sbrk或mmap系统调用来管理内存内部维护一个内存池和空闲链表减少系统调用次数提高分配效率。三、C 内存管理new / deleteC 引入了new和delete来更方便地管理内存尤其是对于自定义类型。int*p1newint;// 申请一个 intint*p2newint(10);// 申请并初始化为 10int*p3newint[10];// 申请 10 个 int 的数组deletep1;deletep2;delete[]p3;// 注意数组用 delete[]与 malloc / free 的最大区别new会调用构造函数delete会调用析构函数。malloc/free只负责内存分配和释放不调用构造/析构。classA{public:A(){cout构造\n;}~A(){cout析构\n;}};A*p1(A*)malloc(sizeof(A));// 不调用构造A*p2newA;// 调用构造free(p1);// 不调用析构deletep2;// 调用析构四、operator new 与 operator delete这两个是 C 内置的全局函数new和delete底层就是调用它们operator new内部调用malloc失败时抛出bad_alloc异常。operator delete内部调用free。你可以重载它们实现自定义内存管理比如内存池。五、new / delete 的实现原理1. 内置类型和malloc/free差不多只是多了异常处理。2. 自定义类型new调用operator new分配内存调用构造函数初始化对象delete调用析构函数清理资源调用operator delete释放内存六、定位 newplacement-new如果你已经有一块内存比如从内存池来的想在这块内存上构造对象可以用定位 newA*p(A*)malloc(sizeof(A));new(p)A();// 在 p 指向的内存上调用构造函数p-~A();// 显式调用析构free(p);常见用途内存池、高性能内存管理。七、malloc/free 与 new/delete 的区别面试必背特性malloc / freenew / delete类型函数操作符初始化不初始化可初始化大小计算需手动计算自动计算返回值void*需强转自动匹配类型失败处理返回 NULL抛出异常构造/析构不调用调用适用对象内置类型内置自定义类型八、常见面试题扩展内存泄漏怎么办使用智能指针unique_ptr、shared_ptr、RAII 机制或工具如 Valgrind 检测。什么是浅拷贝和深拷贝浅拷贝只拷贝指针深拷贝会拷贝指针指向的内容。动态内存必须深拷贝。什么是内存对齐计算机为了高效读写内存要求数据地址是其大小的整数倍。#pragma pack可控制对齐方式。九、总结C/C 内存管理是编程基本功理解清楚内存布局栈、堆、数据段、代码段C 方式malloc / calloc / realloc / freeC 方式new / delete支持构造析构区别malloc 是函数new 是操作符new 会初始化、抛异常、调构造高级话题operator new、定位 new、内存池掌握这些你不仅能写出更安全的代码还能在面试中游刃有余。如果这篇文章对你有帮助欢迎点赞、收藏、转发我们下期再见作者铅笔小新z日期2025 年 12 月 2 日

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价