C++内存七大坑:新手必看的C++内存避坑指南

📅 发布时间:2026/7/17 4:24:51 👁️ 浏览次数:
C++内存七大坑:新手必看的C++内存避坑指南
C内存七大坑新手必看的C内存避坑指南前言很多刚学 C 的同学都会遇到一个非常头疼的问题代码明明能编译、能运行结果莫名其妙崩溃、闪退、逻辑诡异、内存越用越大。其实这些问题 90% 都出在内存上。C 给了我们操作内存的权力同时也带来了一堆容易踩的坑。这篇文章把 C 内存里最经典、最容易忽略的知识点一次性梳理清楚。一、先搞懂C 内存分哪几块一个运行起来的 C 程序内存主要分为 5 个区域栈Stack存局部变量、函数参数。特点自动创建、自动销毁速度快但空间小。堆Heap用new / malloc申请的内存。特点手动申请、手动释放空间大但最容易出问题。全局/静态区全局变量、static变量。程序一启动就存在直到程序结束。常量区只读字符串常量、const修饰的常量。只能看不能改改了直接崩溃。代码区存放程序指令我们一般不用管。只要分清栈、堆、常量区内存问题就解决了一半。二、C 内存最容易踩的 7 个经典坑1. 不要返回局部变量的指针/引用这是最常见、最经典的野指针问题。int* func() { int a 10; // 栈上变量 return a; // 函数结束a 就被销毁了 }你以为返回了一个合法地址实际上返回的是一块已经被回收的无效地址。再去读写程序直接崩溃。一句话记住函数里的临时变量出了函数就死别留它地址。2. 栈空间很小别定义超大数组栈的空间一般只有几 MB你定义一个超大数组直接栈溢出。// 危险直接爆栈 int arr[1000000];正确做法大数组、大数据用vector底层是堆内存安全又方便。3. 数组越界C 不会提醒你但会让你崩溃int arr[5] {1,2,3,4,5}; cout arr[5]; // 越界没有第 6 个元素C 不会帮你检查下标是否合法。后果输出乱码程序闪退偷偷修改其他变量逻辑全错记住下标从 0 开始只能访问0 ~ 长度-1。4. 浮点数不能直接用 比较double a 0.1 0.2; double b 0.3; if (a b) { // 你以为会进其实根本进不去 }因为浮点数在计算机里是近似存储不是精确值。正确写法#include cmath if (fabs(a - b) 1e-9) { // 认为两个数相等 }一句话浮点数比“差多少”不比“等不等”。5. 浅拷贝你以为复制了其实共用一套内存如果你自己写类里面有指针不写深拷贝程序必崩。class MyStr { char* data; public: MyStr(const char* s) { data new char[strlen(s) 1]; strcpy(data, s); } ~MyStr() { delete[] data; } }; MyStr s1(abc); MyStr s2 s1; // 浅拷贝s1、s2 指向同一块内存结果两个对象共用一块内存析构时删两次→ 程序崩溃解决类里有指针一定要写拷贝构造函数 赋值运算符重载深拷贝。6. shared_ptr 循环引用最隐蔽的内存泄漏智能指针不是万能的// A 持有 BB 持有 A class A { public: shared_ptrB b; }; class B { public: shared_ptrA a; };互相指着引用计数永远不为 0对象永远不释放内存悄悄泄漏你还找不到原因。解决一方使用weak_ptr打破循环。7. 不要修改字符串常量const char* s hello; s[0] H; // 直接崩溃因为hello存放在只读内存区不允许修改。想改字符串string s hello; s[0] H; // 安全三、总结7 条内存保命口诀不返回局部变量的地址/引用栈空间小大数据用 vector数组永远别越界浮点数不用 比较比差值类里有指针一定要深拷贝智能指针警惕循环引用字符串常量不能改把这 7 点牢牢记住你写 C 会比 80% 的初学者更稳。后记C 内存是入门到进阶的必经之路也是面试高频考点。先理解内存区域再避开常见坑点你的代码稳定性会直接上一个台阶。