【C/C++】基础知识之动态申请内存空间new-delete

这篇具有很好参考价值的文章主要介绍了【C/C++】基础知识之动态申请内存空间new-delete。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

【C/C++】基础知识之动态申请内存空间new-delete

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


一、c语言动态申请内存空间

c语言堆区malloc相关知识点:【c语言】五大内存区域 | 堆区详解

使用malloc将堆区创建一个存储空间并把局部变量存放进去,该数据如果不被手动回收,就会一直存放在堆区中。

释放完后将指针p赋值为NULL,避免野指针的出现

	int* p = (int*)malloc(sizeof(int));
	//...........
	free(p);
	p = NULL;

在C++中,有一种全新的方式用来在堆区动态申请内存空间——newdelete关键字

【C/C++】基础知识之动态申请内存空间new-delete

二、new-delete

使用new关键字动态在堆区申请内存空间,new关键字后 放 类型,返回的是对应类型的地址!!!

格式:new关键字 后加上类型名,在堆区申请该类型空间大小的空间

代替c语言中的malloc 还不用进行强转

例如:

	int* p1 = new int;
	*p1 = 1;
	cout << *p1 << endl;

使用delete代替c语言中的free释放空间

但是delete不是函数,关键字后直接加上要释放空间的指针地址,仍然将指针p赋值为NULL:

	int* p1 = new int;
	*p1 = 1;
	cout << *p1 << endl;

	delete p1;
	p1 = NULL;

基本数据

在int类型后加(),可以赋予初始值

int* p2 = new int(7);
	cout << *p2 << endl;

	delete p2;
	p2 = NULL;

如果未指定初始值,则初始值为0:

int* p3 = new int();
	cout << *p3 << endl;

	delete p3;
	p3 = NULL;

【C/C++】基础知识之动态申请内存空间new-delete

数组

申请一个int型数组的堆区空间:

	int* p4 = new int[3];

同样可以赋予初始值:

	int* p4 = new int[3] {1,2,3};
	for (int i = 0; i < 3; i++)
	{
		cout << p4[i] << " ";
	}

与基本数据类型不同的是:在delete数组的时候,需要在指针前加[]用来代表数组,二维数组同样

中括号[]放在前面,代表整个数组

例如:

	delete []p4;
	p4 = NULL;

【C/C++】基础知识之动态申请内存空间new-delete

注:

delete回收空间并不包含指针本身,而是指针指向的内存空间,同一块内存空间不要重复释放,除非指针已经被赋空,对空指针使用delete是安全的。
对栈区的内存空间不能使用delete来释放!

三、new指针、new数组

只需要牢记:

使用new关键字动态在堆区申请内存空间,new关键字后 放 类型,返回的是对应类型的地址!!!

就两种情况

  • new指针——
  • new数组——

1.new 整型指针

整型指针对应的地址:二级指针,因此为int ** p1

	int** p1 = new int*;
	delete p1;
	p1 = NULL;

2.new 指针数组

指针数组相关知识点:【c语言】指针数组

指针数组对应的地址也是二级指针,因此为int ** p2

	int** p2 = new int* [3];
	delete []p2;
	p2 = NULL;

3.new 数组指针

数组指针相关知识点:【c语言】数组指针

数组指针int(*p3)[3]的指针 在类型上再加*int(**p3)[3]

int(**p3)[3] = new (int(*)[3]);
	delete p3;
	p3 = NULL;

4.new 整型的二维数组

指向二维数组的指针为:一维数组指针int(*p4)[3]

	int(*p4)[3] = new int[2][3];
	delete[]p4;
	p4 = NULL;

5.new 函数指针

先随便定义一个函数:

void fun(int a)
{
	cout << "TianXi Studio" << endl;
}

指向函数指针的地址:在函数指针void(*p5)(int)基础上加*void(**p5)(int)

	void(**p5)(int) = new (void (*)(int));
	delete p5;
	p5 = NULL;

总结

malloc-free和new-delete的区别

  • new、delete是关键字,需要C++的编译器支持,malloc()、free() 是函数,需要头文件支持

  • new申请空间不需要指定申请大小,根据类型自动计算,new返回的是申请类型的地址,不需要强转,malloc()需要显式的指定申请空间的大小(字节),返回void* ,需要强转成我们需要的类型。

  • new申请空间的同时可以设置初始化,而malloc 需要手动赋值

  • malloc()free() 则不会调用构造、析构函数

【C/C++】基础知识之动态申请内存空间new-delete


在C语言中,常用的动态申请内存空间的函数是malloc、callocrealloc,并且需要手动free释放已分配的内存空间

而在C++中,可以使用new操作符来动态创建一个对象或一段对象数组

new可以自动调用构造函数初始化对象,而delete操作符则会自动调用析构函数,释放分配的内存空间(后面会提到)

使用delete释放动态分配的对象数组时记得加上方括号,否则只会释放首个元素并不会将整个数组的内存空间都释放掉。


【C/C++】基础知识之动态申请内存空间new-delete文章来源地址https://www.toymoban.com/news/detail-470620.html

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

到了这里,关于【C/C++】基础知识之动态申请内存空间new-delete的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言基础知识:内存分配

    目录 内存分配原理 内存分配方法 静态内存分配 动态内存分配 MALLOC() CALLOC()/

    2024年02月07日
    浏览(37)
  • 【cuda】二、基础知识: 内存管理 同步

    在CUDA中,使用** cudaMalloc() 来分配设备内存,使用 cudaFree() **来释放设备内存。 cudaMallocManaged 统一内存管理 **统一虚拟寻址(Unified Memory): 使用 cudaMallocManaged() **来分配可以在CPU和GPU之间共享的内存。无需关心数据在主机或设备上。 cudaMallocManaged 是一个CUDA运行时应用程序接

    2024年01月18日
    浏览(56)
  • C++基础知识 (命名空间、输入输出、函数的缺省参数、函数重载)

    🌠 例1: #include iostream 标准输入输出 std 是 c++ 标准库的命名空间,将标准库的定义实现都放到这个命名空间中 using namespace std 展开 std 里的内容 cout   c 代表的是 console 控制台的意思, out 有输出的意思 流运算符 流插入 endl 等价于 \\\'n\\\' 在 c++ 中,变量、函数和类的名称存在于

    2024年02月15日
    浏览(44)
  • 操作系统基础知识介绍之内存层次结构(一)

    传统上,内存层次结构的设计者专注于优化平均内存访问时间,这由缓存访问时间、未命中率和未命中惩罚决定。 然而,最近,功率已成为主要考虑因素。 在高端微处理器中,可能有 60 MiB 或更多的片上高速缓存,并且大型二级或三级高速缓存将消耗大量功率。 这个问题在

    2024年02月04日
    浏览(52)
  • JVM基础知识(内存区域划分,类加载,GC垃圾回收)

    目录 内存区域划分 JVM中的栈 JVM中的堆 程序计数器 方法区(元数据区) 给一段代码,某个变量在哪个区域上? 类加载 类加载时机 双亲委派模型 GC 垃圾回收机制 GC 实际工作过程 1.找到垃圾/判定垃圾 1.可达性分析(Java中的做法) 2.引用计数 2.清理垃圾 1.标记清除 2.复制算法 3.标记整

    2024年02月07日
    浏览(64)
  • 知识储备--基础算法篇-动态规划

    第一次接触动态规划,不知道具体什么意思,做了题才发现动态规划就是把大问题变成小问题,并解决了小问题重复计算的方法称为动态规划。比如上楼梯,一次上一阶或二阶,求有多少种算法,就可以拆成最后一阶的方法数等于前一阶的方法数加前两阶的方法数,这就是递

    2024年02月11日
    浏览(40)
  • 程序员基础的硬件知识(cpu、主板、显卡、内存条等)

    一、综合简介 cpu: 负责运算数据,就等于你的大脑运算速度。 显卡: 本来没有显卡,后来因为大家对图片要求越来越高,视频要求越来越高,啥都让cpu算太累了,于是分出来一个,专门用来计算图片数据的,叫做显卡。 内存条: 相当于人的口袋,你出门时(开机时),能

    2024年02月01日
    浏览(50)
  • 《Vite 基础知识》使用 Glob 动态加载 .vue 文件

    开发基于 Vite + Vue3 的组件库,多个 .vue 文件需要动态加载! 注意 import.meta.globEager 已经弃用,请使用 import.meta.glob 来代替! 代码第 1 行,注意使用两个 **,匹配当前目录及其嵌套的全部子目录下的文件; 代码第 4 行,异步使用 Promise 加载,所以要在 then 中获取真正的组件对

    2024年01月18日
    浏览(43)
  • 操作系统基础知识介绍之内存技术和优化(一)(包含SRAM和DRAM、SDRAM、GDRAMs)

    使用 SRAM 可以满足最小化高速缓存访​​问时间的需要。 然而,当缓存未命中时,我们需要尽快将数据从主存中移出,这就需要高带宽内存。 这种高内存带宽可以通过将构成主内存的许多 DRAM 芯片组织成多个内存条并使内存总线更宽来实现,或者两者兼而有之。 高带宽内存

    2024年02月04日
    浏览(38)
  • 计算机体系结构基础知识介绍之缓存性能的十大进阶优化之编译器控制的预取和利用HBM扩展内存层次(七)

    硬件预取的替代方案是编译器在处理器需要数据之前插入预取指令来请求数据。 预取有两种类型: ■ 寄存器预取将值加载到寄存器中。 ■ 高速缓存预取仅将数据加载到高速缓存。 这两种类型都可以分为有错或无错的,即预取的地址是否会导致虚拟地址错误或保护错误的异

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包