动态内存管理 new 和 delete

在软件开发中,需要动态地申请和销毁内存空间。在C语言中是提供了库函数malloc()和free()来分配和撤销内存空间的。但是,使用malloc()函数时必须指定需要申请的内存空间的大小。其调用形式为:

void* p = malloc(size);

其中 size 就是字节数,需要用户指定需要申请内存的字节数。

例如,我们想申请一个内存块,存放一个struct结构体对象。此时,我们可以使用sizeof()运算符来求出struct结构体对象的大小,然后,再调用malloc()来申请内存空间。

C++提供了简单而功能强大的运算符 new 和 delete 来取代 malloc()和 free()函数(为了与C语言兼容,C++仍保留这两个函数)。

new 运算符,用于申请内存空间,使用的一般格式为:

(1) new 类型;             ---   申请一个内存块,内存的大小是“类型”占用的字节数。成功,返回申请到内存块的首地址,失败,返回NULL空指针。

(2) new 类型(初始值);      ---   申请一个内存块,内存的大小是“类型”占用的字节数,并给内存块存放初始值。成功,返回申请到内存块的首地址,失败,返回NULL空指针。

(3) new 类型[数组长度]; ---   申请一个内存块,内存块是一个数组,数组的元素是“类型”指定的元素类型,在中括号[]中指定数组的长度。成功,返回申请到内存块的首地址,失败,返回NULL空指针。

注意:用 new 分配数组空间时,不能指定初值。

delete 运算符,用于释放内存空间,使用的一般格式为:

(1) delete 指针变量;

(2) delete []数组;

注意:使用new关键字申请的内存空间,需要使用delete关键字释放。如同C语言,使用malloc()函数申请的内存空间,需要使用free()函数来释放。

举例分析如下:

new int;        //开辟一个存放整型数据的空间,返回一个指向整型数据的指针;

new int(100);   //开辟一个存放整型数据的空间,并指定该整数的初值为100;

new char[16];   //开辟一个存放字符数组的空间,该数组有16个元素,每个元素的类型是char,并返回指向字符类型的指针;

new int[5][6];  //开辟一个存放二维整型数组的空间,该数组大小为5*6个元素;

float *p = new float(168.889);  //开辟一个存放实数的空间,并指定该实数的初值为168.889,并将返回指向实型数据的指针,赋给指针变量p;

在上面的举例中,有申请一个float类型大小的内存空间,并存放168.889的初始值。那么,如果要销毁用 new 申请的空间,可以用delete关键字销毁,如下:

delete p;

前面用 new char[16]; 开辟的空间,如果把返回的指针赋给了指针变量 p,如下:

char* p = new char[16];

那么,应该用以下形式的delete 运算符销毁所申请的空间:

delete []p;    //在指针变量前面加一个中括号,表示对数组释放内存;

如果由于内存不足等原因,而无法正常分配空间,则 new 会返回一个空指针NULL,用户可以根据该指针的值判断申请分配内存是否成功。如下是测试例子:

程序运行结果如下:

可以看到,执行 new int(16289);代码,就申请int类型的内存空间,并设置16289这个数值。所以,给指针变量pi申请的内存空间,里面存放了16289这个数值。

执行 new char[256]; 此时,申请一个char类型的数组,数组的长度是256个元素。把申请到内存空间地址,设置给指针变量p,然后,给指针变量p指向的地址拷贝字符串。

创建二维数组的操作如下,首先,声明一个二维数组的指针对象:

char (*ps)[128];//定义二维数组,第二维是128个元素;

表示数组的元素是 char 类型,是一个二维数组。数组的第二维是128个元素的长度。第一维的长度不确定,是char*类型。

创建二维数组,如下:

ps = new char[3][128];//创建二维数组;

此时,创建二维数组,第一维是3个元素,第二维是128个元素;第一维中的元素,每个元素是一个128个元素长度的一维数组。

注意:new 和 delete 是运算符(所以,它们可以重载),不是函数,因此执行效率高。malloc()函数要和free()函数配合使用,new和delete配合使用,不能混合使用。

还有,free()和new撤销后(释放内存后)的指针,还保留原来的地址值。所以,为了预防野指针,释放后的指针,应该给其赋NULL值。

因为,释放后的内存块,内存被系统回收!所以,原来保留的内存地址已经被系统回收,不可以再使用!

总结

本章节我们更深一步学习了C++的基础知识,学习了引用的定义和使用,这是C++语言中一个重要的知识点,需要重点掌握。

然后,学习了内联函数的使用,作用域运算的操作,new和delete关键字的使用,这些都是C++语言特性。有了这些C++基础知识之后,我们接下来开始学习C++的面向对象编程,开始学习C++最重要的概念:类的定义和使用。

读者要仔细分析,掌握好每一个知识点,然后,自己总结出对该知识点的理解。自己总结出来的知识,理解才深刻,才是自己掌握的知识。

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

动态内存管理 new 和 delete相关推荐

  1. C++ 动态内存管理:c/c++的动态内存管理,new/delete,operator new/delete,placement-new, 内存泄漏

    c/c++的动态内存管理 new/delete opeartor new/delete placement-new 内存泄漏 c/c++的动态内存管理 在开始之前首先要了解c和c++的内存分布,我简单 ...

  2. 动态内存管理:malloc和free以及new和delete的联系与区别

    动态内存管理:malloc和free以及new和delete的联系与区别 文章目录 动态内存管理:malloc和free以及new和delete的联系与区别 一. C/C++中程序内存区域划分: 二. ...

  3. 深入理解C++ new/delete, new []/delete[]动态内存管理

    在C语言中,我们写程序时,总是会有动态开辟内存的需求,每到这个时候我们就会想到用malloc/free 去从堆里面动态申请出来一段内存给我们用.但对这一块申请出来的内存,往往还需要我们对它进行稍许的& ...

  4. C和C++安全编码笔记:动态内存管理

    4.1 C内存管理: C标准内存管理函数: (1).malloc(size_t size):分配size个字节,并返回一个指向分配的内存的指针.分配的内存未被初始化为一个已知值. (2).aligne ...

  5. 《C++应用程序性能优化::第五章动态内存管理》学习和理解

    <C++应用程序性能优化::第五章动态内存管理>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版. 2010.8.29 cs_wuyg@126.com ...

  6. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  7. 析构函数和动态内存管理

    析构函数 当类的对象撤销时,析构函数被隐式调用.析构函数不是释放内存,而是释放内存前进行扫尾工作. 对象何时撤销?1,静态分配的,生存期过后撤销.2,动态分配的,delete时撤销. 析构函数的命名 ...

  8. C ++ 内存 | C/C++的动态内存管理_1

    C/C++的动态内存管理 1. C语言中,我经常会用到动态内存管理的三个命令: malloc calloc rolloc free (1)malloc 用来申请head内存空间的内存. (2)call ...

  9. C++---动态内存管理

    C/C++内存分布 栈:存储非静态局部变量.函数参数.返回值. 内存映射段:动态库. 堆:程序运行时动态内存分配. 数据段:存储全局变量.静态数据. 代码段:可执行代码,只读常量. C语言中动态内存管 ...

最新文章

  1. eval解析json注意点
  2. android启动第三方应用
  3. ngixn+tomcat负载均衡 动静分离配置 (nginx反向代理)
  4. matlab程序聚类预测机器学习
  5. SpringMVC(一):环境搭建
  6. Simulink之多重逆变电路
  7. 设计模式学习笔记——模板(Template)模式
  8. structs2 result type介绍
  9. [Hbase]Hbase知识大全
  10. 怎么调用html调色板,JS实现仿PS的调色板效果完整实例
  11. SQL 比较时间大小
  12. 水晶易表Xcelsius 2008安装指南 支持WIN10 64位 + office2016
  13. 解决:远程服务器(阿里云 VHost)和本地文件传输 windows
  14. 还不会记录脚本日志吗?戳这里 ->>> python中logging模块二次封装记录脚本的每一步脚印
  15. Android 设计模式之二:MVP模式与MVC模式 .
  16. 【R语言】他说每个生存曲线一定要看到p值,不能0.05,0.01,0.001
  17. 【《Redis深度历险》读书笔记(1)】基础:万丈高楼平地起 ——Redis 5种基础数据结构
  18. VC通过ADO操作Access2007数据库
  19. 图书管理系统之登陆注册页面布局(一)
  20. Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录

热门文章

  1. ccf-CSP 202209
  2. .Net平台学习笔记(7)
  3. elasticsearch中DSL之Span queries
  4. Room cannot create an SQLite connection to verify the queries
  5. Arm和Unity联合推出:适用于移动应用程序的3D美术优化-[3]纹理
  6. 如何探索自己的云原生之路,企业选择自助火锅还是海底捞?
  7. java的printwriter_Java PrintWriter.print()写入数据
  8. php生成临时文件,什么PHP扩展将临时文件写入/ tmp文件夹?
  9. 宝宝感冒用药记录-仅供参考
  10. 无CUDA支持的dlib库的安装与使用