【1++的C++初阶】之内存管理

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

👍作者主页:进击的1++
🤩 专栏链接:【1++的C++初阶】

一,C/C++的内存分布

【1++的C++初阶】之内存管理
如上图所示,C/C++程序在运行时占用的内存主要是这几部分

 1.  栈:函数栈帧是建立在栈中的,所以在栈中会存储一些非静态局部变量,函数参数,返回值等。
 2. 堆:我们动态申请的内存就在堆中。
 3. 内存映射段:后面的文章会涉及,暂时不是很了解。
 4. 数据段:全局变量,static修饰的变量,函数等。
 5. 代码段:const修饰的只读常量,可执行程序等。

二,malloc,realloc,calloc的区别

我们首先来说他们各自的作用与用法:

  1. malloc:malloc是C语言中用来动态申请内存的函数,它能够申请所输入参数大小的空间,单位为字节,并且malloc的类型为void*,因此,在使用时要进行强制类型转换。
  2. calloc:calloc和malloc的功能差不多,区别就是,在申请内存的同时,能够将内存初始化为0。
  3. realloc:reallocation主要进行扩容,其有两种扩容方式,一是,在原来申请内存的后面扩容,二是,由于其后面的内存不够,另找一块地方,将原来申请内存中的内容拷贝到新的申请的内存中。
  4. 它们申请失败都会返回NULL,因此要加断言或判断语句来进行判断是否申请成功。

三,C++的内存管理- -new和delete

初识new和delete

我们来看以下代码:

void Test()
{
	int* ptr1 = new int;//申请一个int类型的空间
	int* ptr2 = new int[3]{1,2,3};//申请三个int类型的空间,并将其分别初始化为1,2,3
	int* ptr3 = new int(10);//申请一个int类型的空间,并将其初始化为10
	
}
int main()
{
	Test();
	return 0;
}

其运行结果如下图:
【1++的C++初阶】之内存管理
以上就是new的几种用法,要注意的是,在第二种用法中,对开辟的空间要全部初始化,不能初始化部分。

再来看下面的代码:

void Test()
{
	int* ptr1 = new int;
	int* ptr2 = new int[3]{1,2,3};
	int* ptr3 = new int(10);
	delete ptr1;
	//delete[] ptr2;
	delete ptr2;
	delete ptr3;
}
int main()
{
	Test();
	return 0;
}

运行结果如下:
【1++的C++初阶】之内存管理
通过上述结果,我们发现new 要与delete搭配,当要释放申请了多个对象的连续空间时,就必须用delete [] xxx来进行释放。
也就是new [] 要与delete [] 搭配。

new和delete操作自定义类型

我们来看下面这段代码:

class Date
{
public:
	Date(int year = 2023, int month = 5, int day = 3)
		:_year(year)
		, _month(month)
		, _day(day)

	{
		cout << "Date()" << endl;
	}

	~Date()
	{
		cout << "~Date()" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

void Test2()
{
	Date* p1 = (Date*)malloc(sizeof(Date));
	Date* p2 = new Date(2022,5,18);
	//Date* p3 = new Date[3];
	free(p1);
	delete p2;
	//delete[] p3;
}

运行结果如下:
【1++的C++初阶】之内存管理
将p2屏蔽后:
【1++的C++初阶】之内存管理
通过观察上述两张运行结果图,我们发现,使用new和delete编译器会自己调用其构造与析构函数,而使用malloc与free则不会。而对于内置类型,则几乎没区别。

深度剖析new与delete

我们将上述代码的汇编指令调出来,如下图:
【1++的C++初阶】之内存管理

在图中我们可以清楚的观察到,new先是调用了operator new然后调用了其构造函数。delete也是类似先调用其析构,再调用operator delete。那么什么是operator new和opertaor delete呢?

operator new 和operator delete是系统提供的全局函数与前面所学的类重载的函数是不同的;new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果应对措施用户设置了,则继续申请,否则抛异常。malloc申请失败返回NULL,而new会抛异常。
operator delete: 该函数最终是通过free来释放空间的。

定位new

什么叫定位new?定位new就是已分配的原始内存空间中调用构造函数初始化一个对象。

定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如
果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。

定位new的简单使用如下代码:

void Test2()
{
	Date* p1 = (Date*)malloc(sizeof(Date));
	//Date* p2 = new Date(2022,5,18);
	//Date* p3 = new Date[3];
	new(p1)Date;//定位new显式调用构造函数
	 p1->~Date();//显式调用析构函数
	free(p1);
	//delete p2;
	//delete[] p3;
}

运行结果如下:
【1++的C++初阶】之内存管理文章来源地址https://www.toymoban.com/news/detail-450215.html

四,new/delete与malloc/free的区别

  1. new delete是操作符而malloc,free是函数。
  2. new可以就行初始化而malloc不可以。
  3. 对于自定义类型new,delete会调用构造与析构函数,而malloc,free不会。
  4. new申请空间失败后会抛异常而malloc会返回NULL.
  5. new相较于malloc用起来更加方便。

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

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

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

相关文章

  • 【C++初阶】第五站:C/C++内存管理 (匹配使用,干货到位)

    前言: 本文知识点: 1. C/C++内存分布2. C语言中动态内存管理方式3. C++中动态内存管理4. operator new与operator delete函数         5. new和delete的实现原理 ( 干货在此 ) 6. 定位new表达式(placement-new)7. 常见面试题 目录 C/C++内存分布 1.内存划分题 2.sizeof 和 strlen 区别? 3.计算siz

    2024年03月11日
    浏览(32)
  • C++初阶之内存分布

    我们先来看下面的一段代码 : 实际输出和对应的内存分布 我在Linux进程一文当中对内存分布和虚拟内存有详细讲解,不了解的小伙伴可以去看看这篇文章: Linux进程 说明: 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。 内存映射段是高效的I/O映射方

    2024年02月16日
    浏览(33)
  • 【C++初阶】:动态管理

    前置知识(堆区):c语言动态内存 额外知识:栈区 对于自定义类型 对多个自定义类型创建时,必须进行初始化,如果不想初始化,那么就得给缺省值。 注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会。 这两个函数不是简单

    2024年02月05日
    浏览(37)
  • 【C++内存管理】内存池

    C++17 引入了一个新的内存资源抽象层 - memory_resource 。其主要目的是将内存的分配和回收与具体的数据结构解耦,从而允许开发人员使用不同的内存管理策略,提高内存管理的灵活性。 memory_resource 是一个基类,可以用于创建和配置具有不同内存管理行为的内存池。 1.1 memory_

    2024年02月13日
    浏览(38)
  • C++内存管理(3)——内存池

    利用默认的内存管理操作符 new/delete 和函数 malloc()/free() 在堆上分配和释放内存会有一些额外的开销。 系统在接收到分配一定大小内存的请求时,首先查找内部维护的内存空闲块表,并且需要根据一定的算法(例如分配最先找到的不小于申请大小的内存块给请求者,或者分配

    2024年02月09日
    浏览(39)
  • C++——内存分配与动态内存管理

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月17日
    浏览(52)
  • 【C++】C++内存管理,模板

    C++中通过 new 和 delete 两个操作符实现动态内存管理 为自定义类型设计,可以在申请空间得同时初始化 使用 new 先申请空间,再调用构造 使用 delete 时先调用析构,再释放空间 operator new 和 operator delete 是系统提供的全局函数,不是运算符重载, 在使用 new 或 delete 时,底层实

    2024年02月01日
    浏览(38)
  • c++ 内存管理一:初识内存分配工具

    前言 侯捷 c++内存管理学习总结笔记。 在C++中,有几种常用的内存分配工具可以帮助进行动态内存管理。 从c++应用程序自上而下,通常会有这样的几种分配内存的方式,当然最终都是直接或间接的调用系统的API。 1 new 和 delete new 和 delete :new操作符用于在堆上分配内存,de

    2024年02月11日
    浏览(43)
  • 深入理解C++内存管理

    C++的高抽象层次,又兼具高性能,是其他语言所无法替代的,C++标准保持稳定发展,更加现代化,更加强大。但在各种活跃编程语言中,C++门槛依然很高,尤其C++的内存问题(内存泄露,内存溢出,内存宕机,堆栈破坏等问题),需要理解C++标准对象模型,C++标准库,标准

    2023年04月08日
    浏览(35)
  • C++——内存管理+模块

    作者:几冬雪来  时间:2023年5月19日 内容:C++——内存管理+模块 目录 前言:   1.new和delete操作自定义类型:  operator new/delete:  定位new表达式(placement-new):  malloc/free和new/delete区别: 2.模板:  结尾:  在上一篇博客中我们成功的对我们的类和对象的知识进行了收尾

    2024年02月06日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包