C++ new delete

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

可执行程序(进程) 的虚拟地址空间:

C++ new delete

内核: 操作系统

栈区:函数的形参,非静态的局部变量,函数现场保护数据等等,栈是向下增长的。

共享库的内存映射区域:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。

堆区: 用于程序运行时动态内存分配,堆是可以上增长的

数据段: 存储全局数据和静态数据,分为.bss 和.data

代码段: 可执行的程序(机器指令) 和 常量数据


C的动态内存管理:

C++ new delete

int main()
{
	int n = 10;
	int* ip = (int*)malloc(sizeof(int) * n);
	int* sp = (int*)calloc(n, sizeof(int));   //n*sizeof(int)
	ipa = (int*)realloc(ipa, sizeof(int) * n * 2);

	free(ipa);
	ipa = NULL;
	free(ipb);
	ipb = NULL;
	return 0;
}
int main()
{
	int* ipa = (int*)malloc(sizeof(int));  //C
	// bad_calloc //malloc realloc calloc  nullptr

	int* ips = new int(10);   //c++   
	//1.sizeof(int);  2.malloc   3.initvalue 
	//new会对申请的空间拿()的值初始化 malloc只能够申请空间
	//new 申请空间失败时  并不是返回一个空指针 
	//throw bad_calloc
	
	free(ipa); ipa = nullptr;   //malloc  把ipa指向的堆区空间还给系统
	delete ips; ips = nullptr;                 //new

}

new: 

int main()
{
    int* p = new int(10);   //
    //1.计算类型大小
    //int* p = (int*)malloc(sizeof(int))
    //2.调用malloc 从堆区申请一个整型空间
    //3.用括号里面的值初始化(10)  malloc无法初始化
    //4.申请的空间的地址给到p  p只指向地址
    //内存不足时 malloc返回一个空指针 new抛出异常
    

    cout << *p << endl; 
    delete p;
    //delete是把p所指向的堆内存还给系统 
    //free之后也要置为空

    p = nullptr; 
    //置为空

}
int main()
{
    int* ip = new int(10);
    delete ip;
    int* s = (int*)::operator new(sizeof(int));
    //              (int*)malloc(sizeof(int))
    //如果堆区空间不足 不管是new 还是::operator new  会抛出异常 throw std::bad_alloc
    //内存泄露:1 申请空间之后把地址丢了,2 程序运行时不断从堆区获取空间 耗损完堆空间
}

 

ip是一个空指针吗?

C++ new delete

 不是

C++ new delete

 C++ new delete

malloc只管开辟内存(按字节开辟),不管初始化

new和delete,称作运算符

解析new delete

        C++中解决动态内存分配的方案是把创建一个对象所需要的操作都结合在一个称为new的运算符里。当用new创建一个对象时,它就在堆里为对象分配内存并调用构造函数完成初始化。

C++ new delete

new后边直接指定类型,如int,在堆上开辟int类型的内存。
小括号里面指定初始值。
所以这里的new不用进行类型转换了。
new不仅可以做内存开辟,还可以做内存初始化操作

malloc开辟内存失败,是通过返回值和nullptr空指针做比较;

new开辟数组内存时是不能在小括号进行初始化的。
这样写,是堆上只负责开辟数组,数组的元素不初始化。

C++ new delete

 这样写,是开辟的数组的所有元素都初始化为0C++ new delete

 释放数组内存

C++ new delete

int main()
{
	int n = 10;
	cin >> n;
	int* ipa = (int*)malloc(sizeof(int) * n);
	int* ips = new int[n];  //数组的概念: 申请一组空间1.sizeof(int)*10;  2.malloc,  3.初始化 4.把申请的空间ips
	//怎么初始化
	free(ipa);
	ipa = nullptr;
	delete[]ips;
	ips = nullptr;
} 
int main()
{
	//1.按照关键字运算  new initvalue  delete
	//new的运算 1.按照关键字运算
	int n = 10;
	int* ipa = new int[n] {1, 2, 3, 4, 5, 6, 7};

	delete[]ipa;
	ipa = nullptr;
	//连续空间初始化{}
}
//2.转变成函数   ::operator new(); not initvalue malloc
//               ::operator delete();
int main()
{
	int n = 10;
	int* ipa = (int*)malloc(sizeof(int) * n);
	if (nullptr == ipa)
	{
		return 1;
	}
	int* ips = (int*)::operator new(sizeof(int) * n,nothrow);
	//  throw bad_calloc
	free(ipa); ipa = nullptr;
	::operator delete(ips); ips = nullptr;
}

C++ new delete

 C++ new delete

 C++ new delete

 new 的函数方式的使用

C++ new delete

 定位new   对已经申请的空间初始化initvalue;

C++ new delete

 malloc 和new 的区别:

new不但能申请空间 还能对申请成功的空间初始化  malloc只能够申请空间;malloc申请空间失败返回空,new申请空间失败抛出异常(throw) ;    ::operator new()申请空间失败抛出异常(throw) ,其他与malloc一样

区别:
1、 new/delete 是C++中的运算符。 malloc / free 是函数
2、 malloc申请内存空间时,手动计算所需大小,new只需类型名,自动计算大小,3、malloc申请的内存空间不会初始化,new可以初始化:
4、 malloc的返回值为void*,接收时必须强转,new不需要:5、malloc申请内存空间失败时,返回的是NULL,使用时必须判空new申请内存空间失败时抛出异常,所以要有捕获异常处理程序文章来源地址https://www.toymoban.com/news/detail-473399.html

到了这里,关于C++ new delete的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Linux】程序地址空间?进程地址空间

    了解进程的运行:  运行结果:我们会发现这打印的结果乱七八糟,因为它也不知道什么时候该干什么  我们让代码睡眠1秒:打印的结果就正常了  以前我们学习的内存管理(程序地址空间):  为了验证上面虚拟地址,我们运行下面代码: (这种问题出现的原因在下面的为

    2024年02月13日
    浏览(94)
  • [Linux]环境变量 进程地址空间(虚拟内存与物理内存的关系)

    hello,大家好,这里是bang_bang,今天我们来讲一下语言层级上的程序地址空间和系统层级上的进程地址空间的区别,在下面中我举的例子会设计到环境变量,所以开篇我先讲讲环境变量。 目录 1️⃣环境变量 🍙 基本概念 🍙环境变量相关命令 🍥查看环境变量echo 🍥添加全局环

    2024年02月15日
    浏览(56)
  • [Linux 进程(五)] 程序地址空间深度剖析

    Linux学习路线比较线性,也比较长,因此一个完整的知识点学习就会分布在两篇文章中,没有连贯起来,订阅的朋友谅解一下,再次感谢订阅! 上一篇文章最后讲到了程序地址空间分布,大家可以先复习一下上一篇文章:程序地址空间的初认识 本片我们深度学习一下程序地址

    2024年01月19日
    浏览(44)
  • [Linux 进程(四)] 再谈环境变量,程序地址空间初识

    上一篇我们讲了环境变量,如果有不明白的先读一下上一篇文章:环境变量讲解 本篇文章我们继续完善环境变量这章剩下的内容,以及main函数第三个参数的详解,进程地址空间的初始。 看完上一篇文章的同学,肯定知道了如何查看环境变量,命令行输入 env: 我们查看一下

    2024年01月18日
    浏览(44)
  • 每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——1/70 第一天【进程和线程】【虚拟地址空间】

    专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮

    2024年02月15日
    浏览(40)
  • Linux: 进程地址空间究竟是什么?进程地址空间存在意义何在?

     在C/C++中,我们常将内存分为: 代码区、常量区、全局区(静态区)、堆、栈 等等。相关内存区域划分如下:(X86, 32位平台) 如何验证C/C++中各区域的相对位置呢?  我们可以在每个区域中选择一个地址来验证C/C++中各区域的相对位置!!具体如下: 【源代码】: 【运行

    2024年04月08日
    浏览(75)
  • Linux之进程(四)(进程地址空间)

    目录 一、程序地址空间 二、进程地址空间 1、概念 2、写时拷贝 3、为什么要有进程地址空间 四、总结 我们先来看看下面这张图。这张图是我们在学习语言时就见到过的内存区域划分图。  下面我们在Linux下看一看内存区域是不是也是这么划分的。 可见在Linux下也是符合上面

    2024年02月04日
    浏览(41)
  • 【Linux】进程周边006之进程地址空间

      👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.程序地址空间 1.1验证地址空间的排布  1.2利用fork函数观察当子进程修改某个共

    2024年02月04日
    浏览(41)
  • 【Linux】进程>环境变量&&地址空间&&进程调度

    主页: 醋溜马桶圈-CSDN博客 专栏: Linux_醋溜马桶圈的博客-CSDN博客 gitee :mnxcc (mnxcc) - Gitee.com 目录 1.环境变量 1.1 基本概念 1.2 常见环境变量  1.3 查看环境变量方法  1.4 和环境变量相关的命令 1.5 环境变量的组织方式 1.6 通过代码如何获取环境变量 1.6.1 命令行第三个参数 1

    2024年04月15日
    浏览(54)
  • 【Linux】进程理解与学习Ⅳ-进程地址空间

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 🌹 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念 浅谈Linux下的shell--BASH 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学习Ⅲ-环境变量 在

    2023年04月14日
    浏览(81)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包