原文链接: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[])相关推荐

  1. 【C语言】动态内存分配详解

    目录 一.为什么有动态内存分配 二.动态内存分配函数 (1)malloc()函数 (2)calloc()函数 (3)realloc()函数 三.常见的动态内存错误 1.越界访问 2.内存泄漏 3.对N ...

  2. C语言动态内存分配详解

    文章目录 前言 一.为什么存在动态内存分配 1.已掌握的内存开辟方式 2.上述开辟空间方式的特点 3.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc 2.free 3.calloc ...

  3. spark on yarn 内存分配详解

    spark on yarn 内存分配详解

  4. 内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc

    很多地方都会使用内存,内存使用过程中操作不当就容易崩溃,无法运行程序,上网Google学习一下,了解整理下他们之间的区别以及使用 ,获益匪浅 0x01 各自的定义和理解 (1)先看GlobalAllo ...

  5. C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)

    目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...

  6. [转载] JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解

    参考链接: 在Java中为静态最终static final变量分配值 转载来源:https://blog.csdn.net/peterwin1987/article/details/7571808 J ...

  7. java运行时内存分配详解

    一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私 ...

  8. 计算机操作系统执行可执行程序时,内存分配详解

    处理器遇到的地址都是虚拟地址,虚拟地址和物理地址都分成页码(页框)和偏移量俩部分组成.在虚拟地址转换成物理地址的过程中,偏移值不变,而页码和页框码之间的映射就在一个映射记录表--页表中 当进程创建时, ...

  9. 指针不显示 upupw_Go高级编程:指针和内存分配详解

    点击上方蓝色"Go语言中文网"关注我们,设个星标,每天学习 Go 语言 定义 了解指针之前,先讲一下什么是变量. 每当我们编写任何程序时,我们都需要在内存中存储一些数据/信息.数据 ...

最新文章

  1. 遇到的浏览器兼容问题及应对方法
  2. 004 两种方法找寻路call
  3. EBS ORACLE使用API批量取消销售订单
  4. Loadrunner基础:Loadrunner Vuser基本概念和应用
  5. c#操作Xml(四)
  6. GC算法-引用计数法
  7. 云服务器的发展历程,盘点微软Azure云服务器的发展历程
  8. 字符串数组转换为整型数组
  9. 关于jQuery引用版本问题
  10. [Oracle SQL]最基本的connect by的用法
  11. 1月8日 官方ros.org太慢,配置中科院ros镜像源 关于解决Ubuntu 14.04安装ros提示校验错误解决
  12. Python MySQL 教程
  13. 如何进入大华智能分析服务器,如何配置大华录像机区域入侵功能,看完就明白...
  14. c语言 多种方式求字符串长度
  15. jQuery插件使用-瀑布流
  16. 基于微信小程序奶茶店在线点单管理系统#毕业设计
  17. 【Neo4j × 知识图谱】图形化数据库基本操作: 创建节点与关系、添加属性、查询节点 | 附:可视化 构建四大名著 知识图谱(含源代码)| word2vec实战: 构造斗罗大陆人物关系
  18. MySQL初级篇 | 修改MySQL密码的四种方法(适合初学者)
  19. 游戏策划学习:胧村正、百闻牌
  20. 详解SQL Server STUFF的用法

热门文章

  1. IOS 跨域问题分析和处理
  2. html5吴丰,HTML5+CSS3 Web前端设计基础教程
  3. 【YOLOv5】详细讲解全过程
  4. 判断两个时间戳相隔多少天
  5. Python使用CDS API时,报Exception: Missing/incomplete configuration错误
  6. 论文阅读笔记:Multi-model Databases: A New Journey to Handle the Variety of Data
  7. 这波分享得你们都爱了吗?
  8. java版tp指令,VAG TP 2.0完整的AT命令列表
  9. 程序员提供9个最好的论坛
  10. 互联网模式OTO、C2C、B2B、B2C名词