码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 初识Cpp之 六、内存分配


    文章目录

      • 六、内存分配
        • (1)C++的内存分区模型
        • (2)使用`new`进行内存分配
        • (3)使用`delete`释放内存

    六、内存分配

    ​ 在C语言中使用的是一套内存分配库函数malloc、calloc、realloc、free来进行内存分配和回收,在C++中仍然可以这样做,但是C++还有更好的方法——new运算符。

    (1)C++的内存分区模型

    ​ C++程序在执行的时候,将内存大致分为4个区域

    • 代码区:存放函数体的二进制代码,由操作系统进行管理;
    • 全局区:存放全局变量和静态变量以及常量,常量包括const修饰的全局常量和字符串常量;
    • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等;
    • 堆区:由程序员分配和释放,若程序员不释放,则程序结束时由操作系统来释放。

    ​ 注意事项:

    1、栈区存放局部变量——函数不要返回局部变量的指针或者引用。

    2、堆区主要用C++的new关键字来开辟空间和释放空间。

    (2)使用new进行内存分配

    ​ 使用C++的内存分配运算符new,程序员需要告诉程序new,需要为哪种数据类型分配内存,new将找到一个长度正确的内存块,然后会返回该内存块的地址。例如:

    typeName *pointer_name = new typeName;		//通用写法
    typeName *pointer_name = new typeName(init_value);	//开辟一块空间并且初始化为init_value
    
    • 1
    • 2
    int *pt = new int;		//为pt指针分配了一个int大小的内存空间
    double *pd = new double(5.0);		//为pd指针分配了一个double大小的空间并且初始化为5.0
    
    • 1
    • 2

    当没有足够的内存空间来进行分配的时候,new会返回一个空指针,我们可以判断new是否返回空指针来判断内存分配是否成功。

    ​ 使用new创建动态数组:只要将数组的元素类型和元素数目告诉new,必须在类型名后面加上方括号[],其中包含元素数目。

    typeName *pointer_name = new typeName [ArrySize];		//通用写法
    
    • 1

    当程序使用完new分配的内存块时,应该使用delete来释放它们,对于使用new创建的数组,应该使用另一种格式的delete来释放,delete后面必须加上方括号[]。

    delete [] pointer_name;		//通用写法
    
    • 1

    举个示例:

    int *pt = new int[20];		//分配空间
    delete [] pt;			//释放空间
    
    • 1
    • 2

    (3)使用delete释放内存

    ​ C++的内存释放运算符delete,delete的作用是释放已经使用new进行内存分配的空间(不要尝试释放已经释放的内存块,这样做的结果是未定义的)。但是对空指针NULL使用delete是安全的,例如:

    int *ps = new int;
    int *pt = NULL;
    delete ps;			//释放ps指向的内存空间
    delete pt;			//释放空指针是安全的
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Linux之安全最佳做法(未完成)
    【蓝桥杯国赛真题07】python杨辉三角形 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析
    Elasticsearch系列教程之Elasticsearch Kibana Head等工具安装
    【源码分析】Spring中的设计模式——Context与Factory的关系
    胰蛋白酶的化学性质及应用
    【Leetcode】200.岛屿数量
    java spring cloud 企业工程管理系统源码+二次开发+定制化服务
    SSM+图书馆电子文件资源管理 毕业设计-附源码091426
    C# StringBuilder 使用
    docker自动构建jar镜像,自动发布最新镜像的简单shell脚本
  • 原文地址:https://blog.csdn.net/qq_44940689/article/details/126680185
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号