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

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

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

前言

很多刚学 C++ 的同学都会遇到一个非常头疼的问题:

代码明明能编译、能运行,结果莫名其妙崩溃、闪退、逻辑诡异、内存越用越大

其实,这些问题 90% 都出在内存上。

C++ 给了我们操作内存的权力,同时也带来了一堆容易踩的坑。

这篇文章把 C++ 内存里最经典、最容易忽略的知识点一次性梳理清楚。


一、先搞懂:C++ 内存分哪几块?

一个运行起来的 C++ 程序,内存主要分为 5 个区域:

  1. 栈(Stack)存局部变量、函数参数。特点:自动创建、自动销毁,速度快,但空间小。

  2. 堆(Heap)new / malloc申请的内存。特点:手动申请、手动释放,空间大,但最容易出问题。

  3. 全局/静态区全局变量、static变量。程序一启动就存在,直到程序结束。

  4. 常量区(只读)字符串常量、const修饰的常量。只能看,不能改,改了直接崩溃。

  5. 代码区存放程序指令,我们一般不用管。

只要分清栈、堆、常量区,内存问题就解决了一半。


二、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 持有 B,B 持有 A class A { public: shared_ptr<B> b; }; class B { public: shared_ptr<A> a; };

互相指着,引用计数永远不为 0,

对象永远不释放,内存悄悄泄漏,你还找不到原因

解决:

一方使用weak_ptr,打破循环。


7. 不要修改字符串常量

const char* s = "hello"; s[0] = 'H'; // 直接崩溃!

因为"hello"存放在只读内存区,不允许修改。

想改字符串:

string s = "hello"; s[0] = 'H'; // 安全

三、总结:7 条内存保命口诀

  1. 不返回局部变量的地址/引用

  2. 栈空间小,大数据用 vector

  3. 数组永远别越界

  4. 浮点数不用 == 比较,比差值

  5. 类里有指针,一定要深拷贝

  6. 智能指针警惕循环引用

  7. 字符串常量不能改

把这 7 点牢牢记住,你写 C++ 会比 80% 的初学者更稳。


后记

C++ 内存是入门到进阶的必经之路,也是面试高频考点。

先理解内存区域,再避开常见坑点,你的代码稳定性会直接上一个台阶。

http://www.jsqmd.com/news/435690/

相关文章:

  • 2026年汝窑茶具专业选型指南:汝窑盖碗/月白汝窑/汝窑茶壶/办公杯优质供应商推荐 - 品牌推荐官
  • 2026年重庆古奥标识在景区智慧导览标识领域排名及品牌推荐 - 工业设备
  • 面向开发者:淘宝商品评论 API 的使用场景与技术实现(Python 实战版)
  • 在Virtualbox上配置Ubuntu的若干坑
  • 2026年拖链行业新风向:为何机床商务网成为采购首选? - 品牌推荐大师1
  • 分析2026年石磨面粉机械品牌制造商,费用低又靠谱的有哪些 - mypinpai
  • 2026年工控主板厂家推荐:智能制造趋势评测,涵盖机器人及智慧医疗应用场景 - 品牌推荐
  • 锂离子电池穿刺不燃技术取得突破
  • 尝试了各种大模型,都无法从草图及描述直接画出来
  • 2026年工控一体机厂家推荐:基于多行业应用实测评价,针对定制化与成本控制痛点精准指南 - 品牌推荐
  • 题解:蓝桥云课 178 全球变暖
  • 2026年工控主板厂家推荐:智能制造趋势评测,涵盖机器人及数字工业场景核心痛点 - 品牌推荐
  • 创客匠人的生态共建:从单向输出到用户共创的知识服务新范式
  • 2026油烟检测仪/油烟浓度检测仪品牌实力排行TOP10|口碑与性价比综合榜单 - 品牌推荐大师1
  • AI生态包含哪些内容问问四川谦与谦寻科技有限公司精准获客平台
  • 题解:蓝桥云课 3423 安全序列
  • 亿坊·专业家政系统开发|功能全面,支持售后保障+源码交付!
  • zblog升级之后出现后台登录错误
  • java集合面试题
  • 固定床反应器知名品牌(2026年最新版):权威推荐与对比 - 品牌推荐大师1
  • vs加载新项目如何跳过添加的临时模块进行信任检查
  • 分期乐购物额度怎么安全回收?这份避坑攻略请收好 - 可可收
  • 第三方抖音买单系统开发,可直接对接官方接口! - 阿里AI专家
  • 题解:蓝桥云课 3367 破损的楼梯
  • 闲置支付宝立减金别浪费!可可收教你最稳妥的处理方法 - 可可收
  • 测试用随笔
  • 题解:蓝桥云课 182 小朋友崇拜圈
  • 2026年工控一体机厂家推荐:基于行业应用深度评测,直击兼容性与服务响应核心痛点 - 品牌推荐
  • 2026年3月热处理温控设备厂家推荐,行业权威盘点与品质红榜发布 - 品牌鉴赏师
  • 2026年高活性NMN品牌哪家好,NAD+口服真相揭秘,NMN富豪长寿黑科技曝光 - 速递信息