news 2026/3/10 4:18:43

C++ 内存分配详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 内存分配详解

内存分配是C++编程中的核心概念,主要分为栈分配堆分配两种方式。

1. 栈内存分配(自动分配)

栈内存由编译器自动管理,分配和释放速度快。
特点:

  • 自动分配和释放
  • 大小有限(通常几MB)
  • 局部变量存储在栈上
  • 函数结束时自动释放
#include<iostream>usingnamespacestd;voidstackExample(){intx=10;// 栈上分配intarr[100];// 栈上分配数组(大小固定)doubled=3.14;// 函数结束时,所有局部变量自动释放}intmain(){stackExample();return0;}

2. 堆内存分配(动态分配)

堆内存由程序员手动管理,使用newdelete操作符。
特点:

  • 手动分配和释放
  • 内存较大(受系统限制)
  • 生命周期由程序员控制
  • 分配速度较慢

3. new 和 delete 的基本用法

分配单个变量

// 分配内存int*p=newint;// 分配一个int类型的内存*p=42;// 向分配的内存写入值// 分配并初始化int*p2=newint(100);// 直接初始化为100// 释放内存deletep;deletep2;p=nullptr;// 好习惯:释放后置为空指针p2=nullptr;

分配数组

// 分配数组intsize=10;int*arr=newint[size];// 分配10个int的数组// 初始化数组for(inti=0;i<size;i++){arr[i]=i*10;}// 释放数组内存(必须使用 delete[])delete[]arr;arr=nullptr;

4.new的高级用法

初始化数组(C++11及以上)

// 使用初始化列表int*arr1=newint[5]{1,2,3,4,5};// 默认初始化(所有元素为0)int*arr2=newint[5]();// 所有元素初始化为0// 分配并初始化字符串char*str=newchar[10]{'H','e','l','l','o','\0'};

分配多维数组

// 方法1:使用一维数组模拟introws=3,cols=4;int*matrix=newint[rows*cols];// 访问元素:matrix[i * cols + j]// 方法2:指针数组(更直观但需要多层释放)int**matrix2=newint*[rows];for(inti=0;i<rows;i++){matrix2[i]=newint[cols];}// 使用for(inti=0;i<rows;i++){for(intj=0;j<cols;j++){matrix2[i][j]=i*j;}}// 释放多维数组for(inti=0;i<rows;i++){delete[]matrix2[i];}delete[]matrix2;matrix2=nullptr;

5. 内存分配失败处理

传统方式(抛出异常)

try{int*p=newint[1000000000000];// 分配过大的内存delete[]p;}catch(conststd::bad_alloc&e){cout<<"内存分配失败: "<<e.what()<<endl;}

使用 std::nothrow(不抛出异常)

int*p=new(std::nothrow)int[1000000000000];if(p==nullptr){cout<<"内存分配失败"<<endl;// 处理错误}else{delete[]p;}

6. 动态分配对象

单个对象

classMyClass{public:intvalue;MyClass(intv):value(v){cout<<"构造函数: "<<value<<endl;}~MyClass(){cout<<"析构函数: "<<value<<endl;}};intmain(){// 动态创建对象MyClass*obj=newMyClass(42);// 使用对象cout<<"对象值: "<<obj->value<<endl;// 手动释放deleteobj;obj=nullptr;return0;}

7. 内存分配的最佳实践

1. 总是检查分配是否成功

int*p=new(std::nothrow)int[1000];if(!p){// 处理内存不足的情况cerr<<"内存不足!"<<endl;return-1;}

2. 配对使用new/deletenew[]/delete[]

// 正确int*single=newint;deletesingle;int*array=newint[10];delete[]array;// 注意是 delete[]// 错误int*arr=newint[10];deletearr;// 错误!应该使用 delete[]

3. 避免内存泄漏

voidbadFunction(){int*p=newint[100];// 忘记 delete[] p; // 内存泄漏!}voidgoodFunction(){int*p=newint[100];// 使用内存...delete[]p;// 正确释放p=nullptr;}

4. 使用 RAII(Resource Acquisition Is Initialization)

classSmartArray{private:int*data;intsize;public:SmartArray(intn):size(n){data=newint[n];}~SmartArray(){delete[]data;data=nullptr;}// 禁用拷贝构造和赋值(或实现深拷贝)SmartArray(constSmartArray&)=delete;SmartArray&operator=(constSmartArray&)=delete;// 移动语义SmartArray(SmartArray&&other)noexcept:data(other.data),size(other.size){other.data=nullptr;other.size=0;}};intmain(){SmartArrayarr(100);// 自动管理内存// 函数结束时自动调用析构函数释放内存return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/9 20:15:38

鸣潮自动化工具完整使用教程:从零开始轻松掌握智能辅助

鸣潮自动化工具完整使用教程&#xff1a;从零开始轻松掌握智能辅助 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 还在为…

作者头像 李华
网站建设 2026/3/7 7:05:28

MethylDackel:BS-seq甲基化提取的终极利器

MethylDackel&#xff1a;BS-seq甲基化提取的终极利器 【免费下载链接】MethylDackel A (mostly) universal methylation extractor for BS-seq experiments. 项目地址: https://gitcode.com/gh_mirrors/me/MethylDackel MethylDackel是一款专为BS-seq&#xff08;亚硫酸…

作者头像 李华
网站建设 2026/3/9 21:54:52

RookieAI_yolov8:2025年游戏AI自瞄技术完全指南

RookieAI_yolov8&#xff1a;2025年游戏AI自瞄技术完全指南 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 RookieAI_yolov8作为基于YOLOv8深度优化的开源AI自瞄项目&#xff0c;通过先进的…

作者头像 李华
网站建设 2026/3/7 2:00:45

pywebview与React集成的终极指南:高效构建跨平台桌面应用

pywebview与React集成的终极指南&#xff1a;高效构建跨平台桌面应用 【免费下载链接】pywebview Build GUI for your Python program with JavaScript, HTML, and CSS 项目地址: https://gitcode.com/gh_mirrors/py/pywebview 你是否厌倦了传统桌面应用开发的复杂性&am…

作者头像 李华
网站建设 2026/3/8 9:26:00

大模型微调:不冻结参数 vs 冻结主干

大模型微调方式&#xff1a;不冻结参数与冻结主干部分仅加入线性分类头 随着大模型&#xff08;如BERT、GPT、ResNet、CLIP等&#xff09;的发展&#xff0c;微调&#xff08;Fine-tuning&#xff09;已经成为深度学习中处理特定任务的主要方法之一。微调通过在已有的大规模预训…

作者头像 李华
网站建设 2026/3/9 21:38:36

30亿参数改写AI效率范式:Qwen3-30B-A3B如何让企业AI成本降60%?

30亿参数改写AI效率范式&#xff1a;Qwen3-30B-A3B如何让企业AI成本降60%&#xff1f; 【免费下载链接】Qwen3-30B-A3B-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-30B-A3B-GGUF 导语 阿里通义千问最新发布的Qwen3-30B-A3B模型&#xff0c;以305亿…

作者头像 李华