【C++】动态内存分配详解(new/new[]和delete/delete[])
原文链接:https://blog.csdn.net/qq_40416052/article/details/82493916
代码还是原文看着方便,在此不调整格式了
一、为什么需要动态内存分配?
在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。 但是可能存在程序的内存需求只能在运行时确定的情况。 例如,当需要的内存取决于用户输入。 在这些情况下,程序需要动态分配内存,C ++语言将运算符new和delete合成在一起。
(1)特点
1.C++中通过new关键字进行动态内存申请
2.C++中的动态内存分配是基于类型进行的
3.delete关键字用于内存释放
(2)语法
①变量申请:
Type* pointer = new Type;
//...
delete pointer;
表达式用于分配内存以包含一个类型类型的单个元素。
②数组申请:
Type* pointer = new Type[N];
//...
delete[] pointer;
表示用于分配类型类型的元素的块(数组),其中N是表示这些元素的量的整数值。
Example:
int * foo;
foo = new int [5];
在这种情况下,系统为int类型的五个元素动态分配空间,并返回指向序列的第一个元素的指针,该指针被分配给foo(指针)。 因此,foo现在指向一个有效的内存块,其中包含五个int类型元素的空间。
这里,foo是一个指针,因此,foo指向的第一个元素可以使用表达式foo [0]或表达式* foo(两者都是等价的)来访问。可以使用foo [1]或*(foo + 1)访问第二个元素,依此类推......
Note:
我们程序请求的动态内存由系统从内存堆中分配。 但是,计算机内存是一种有限的资源,它可能会耗尽。 因此,无法保证所有使用operator new分配内存的请求都将由系统授予。
(3)动态内存分配Example:
#include <stdio.h>
int main()
{
int* p = new int;
*p = 5;
*p = *p + 10;
printf("p = %p\n", p);
printf("*p = %d\n", *p);
delete p;
p = new int[10];
for(int i=0; i<10; i++)
{
p[i] = i + 1;
printf("p[%d] = %d\n", i, p[i]);
}
delete[] p;
return 0;
}
编译运行,结果:
p = 007F77D8
*p = 15
p[0] = 1
p[1] = 2
p[2] = 3
p[3] = 4
p[4] = 5
p[5] = 6
p[6] = 7
p[7] = 8
p[8] = 9
p[9] = 10
请按任意键继续. . .
二、new关键字与malloc函数的区别
new关键字是C++的一部分 malloc是由C库提供的函数
new以具体类型为单位进行内存分配 malloc以字节为单位进行内存分配
new在申请单个类型变量时可进行初始化 malloc不具备内存初始化的特性
三、new关键字的初始化:
int* pi = new int(1);
float* pf = new float(2.0f);
char* pc = new char('c');
Test:
#include <stdio.h>
int main()
{
int* pi = new int(1);
// int* pa = new int[1];
float* pf = new float(2.0f);
char* pc = new char('c');
printf("*pi = %d\n", *pi);
printf("*pf = %f\n", *pf);
printf("*pc = %c\n", *pc);
delete pi;
delete pf;
delete pc;
return 0;
}
输出结果:
*pi = 1
*pf = 2.000000
*pc = c
请按任意键继续. . .
注意:
int* pi = new int(1); 表示动态分配一个int ,初始化为 1
int* pa = new int[1]; 表示动态分配一个数组,数组大小为1
四、C++动态分配内存异常机制
事项一下,我们的计算机内存优先,如果我们分配一个很大的内存空间,会出现栈满,程序产生异常,程序崩溃。所以我们需要引入异常机制。
C ++提供了两种标准机制来检查分配是否成功。
(1)一个是处理异常。
使用此方法,在分配失败时抛出bad_alloc类型的异常。 例外是这些教程后面解释的强大的C ++特性。 但是现在,您应该知道如果抛出此异常并且未由特定处理程序处理,则程序执行将终止。
此异常方法是new默认使用的方法,并且是在声明中使用的方法,like:
foo = new int [5]; // if allocation fails, an exception is thrown
(2)另一种方法称为nothrow
当使用它时会发生的情况是,当内存分配失败时,而不是抛出bad_alloc异常或终止程序,new返回的指针是空指针,程序继续正常执行 。
可以使用名为nothrow的特殊对象(在header <new>中声明)作为new的参数来指定此方法:
foo = new (nothrow) int [5];
在这种情况下,如果此内存块的分配失败,则可以通过检查foo是否为空指针来检测异常:
int * foo;
foo = new (nothrow) int [5];
if (foo == nullptr) {
// error assigning memory. Take measures.
}
异常处理Example:
// rememb-o-matic
#include <iostream>
#include <new>
using namespace std;
int main ()
{
int i,n;
int * p;
cout << "How many numbers would you like to type? ";
cin >> i;
p= new (nothrow) int[i];
if (p == nullptr)
cout << "Error: memory could not be allocated";
else
{
for (n=0; n<i; n++)
{
cout << "Enter number: ";
cin >> p[n];
}
cout << "You have entered: ";
for (n=0; n<i; n++)
cout << p[n] << ", ";
delete[] p;
}
return 0;
}
编译运行,结果:
<全文完>
参考资料:
1)唐佐林 《C++深度解析教程》
2)C++官网
————————————————
版权声明:本文为CSDN博主「李燕良」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40416052/article/details/82493916
【C++】动态内存分配详解(new/new[]和delete/delete[])相关推荐
- 【C语言】动态内存分配详解
目录 一.为什么有动态内存分配 二.动态内存分配函数 (1)malloc()函数 (2)calloc()函数 (3)realloc()函数 三.常见的动态内存错误 1.越界访问 2.内存泄漏 3.对N ...
- C语言动态内存分配详解
文章目录 前言 一.为什么存在动态内存分配 1.已掌握的内存开辟方式 2.上述开辟空间方式的特点 3.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc ...
- spark on yarn 内存分配详解
spark on yarn 内存分配详解
- 内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc
很多地方都会使用内存,内存使用过程中操作不当就容易崩溃,无法运行程序,上网Google学习一下,了解整理下他们之间的区别以及使用 ,获益匪浅 0x01 各自的定义和理解 (1)先看GlobalAllo ...
- C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)
目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...
- [转载] JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解
参考链接: 在Java中为静态最终static final变量分配值 转载来源:https://blog.csdn.net/peterwin1987/article/details/7571808 J ...
- java运行时内存分配详解
一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私 ...
- 计算机操作系统执行可执行程序时,内存分配详解
处理器遇到的地址都是虚拟地址,虚拟地址和物理地址都分成页码(页框)和偏移量俩部分组成.在虚拟地址转换成物理地址的过程中,偏移值不变,而页码和页框码之间的映射就在一个映射记录表--页表中 当进程创建时, ...
- 指针不显示 upupw_Go高级编程:指针和内存分配详解
点击上方蓝色"Go语言中文网"关注我们,设个星标,每天学习 Go 语言 定义 了解指针之前,先讲一下什么是变量. 每当我们编写任何程序时,我们都需要在内存中存储一些数据/信息.数据 ...
最新文章
- 遇到的浏览器兼容问题及应对方法
- 004 两种方法找寻路call
- EBS ORACLE使用API批量取消销售订单
- Loadrunner基础:Loadrunner Vuser基本概念和应用
- c#操作Xml(四)
- GC算法-引用计数法
- 云服务器的发展历程,盘点微软Azure云服务器的发展历程
- 字符串数组转换为整型数组
- 关于jQuery引用版本问题
- [Oracle SQL]最基本的connect by的用法
- 1月8日 官方ros.org太慢,配置中科院ros镜像源 关于解决Ubuntu 14.04安装ros提示校验错误解决
- Python MySQL 教程
- 如何进入大华智能分析服务器,如何配置大华录像机区域入侵功能,看完就明白...
- c语言 多种方式求字符串长度
- jQuery插件使用-瀑布流
- 基于微信小程序奶茶店在线点单管理系统#毕业设计
- 【Neo4j × 知识图谱】图形化数据库基本操作: 创建节点与关系、添加属性、查询节点 | 附:可视化 构建四大名著 知识图谱(含源代码)| word2vec实战: 构造斗罗大陆人物关系
- MySQL初级篇 | 修改MySQL密码的四种方法(适合初学者)
- 游戏策划学习:胧村正、百闻牌
- 详解SQL Server STUFF的用法
热门文章
- IOS 跨域问题分析和处理
- html5吴丰,HTML5+CSS3 Web前端设计基础教程
- 【YOLOv5】详细讲解全过程
- 判断两个时间戳相隔多少天
- Python使用CDS API时,报Exception: Missing/incomplete configuration错误
- 论文阅读笔记:Multi-model Databases: A New Journey to Handle the Variety of Data
- 这波分享得你们都爱了吗?
- java版tp指令,VAG TP 2.0完整的AT命令列表
- 程序员提供9个最好的论坛
- 互联网模式OTO、C2C、B2B、B2C名词