内存管理下及模板初阶

在这里插入图片描述

嗨喽,今天阿鑫给大家带来内存管理下以及模板初阶的博客,下面让我们开始今天的学习吧!

内存管理下及模板初阶

  1. new和delete的实现原理
  2. 定位new表达式(placement-new)
  3. 常见面试题
  4. 泛型编程
  5. 函数模板
  6. 类模板

1. new和delete的实现原理

1.1 内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:
new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申
请空间失败时会抛异常,malloc会返回NULL。

1.2 自定义类型

new的原理:
1.调用operator new函数申请空间
2.在申请的空间上执行构造函数,完成对象的构造

delete的原理:
1.在空间上执行析构函数,完成对象中资源的清理工作
2.调用operator delete函数释放对象的空间

new T[N]的原理
1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对
象空间的申请
2.在申请的空间上执行N次构造函数

delete[]的原理
1.在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释
在这里插入图片描述

当采用new T[ ]时,会多开四个字节的一个空间,但是返回的是P2指针,只有正确调用delete[ ]才能正确进行资源的清理

2.定位new表达式(placement-new)

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
使用格式:

new (place_address) type或者new (place_address) type(initializer-list)
place_address必须是一个指针,initializer-list是类型的初始化列表

使用场景:

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

using namespace std;
class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
	private:
		int _a;
};

int main()
{
	//A* p1 = (A*)operator new(sizeof(A));
	//new(p1)A;//显示调用构造

	A* p1 = new A[10]{ 0,1,2,3,4,5,6,7,8,9 };
	delete[]p1;//直接调用new和delete

	//**将new拆成operator new+new(指针)类型(显示调用构造函数)**
	A* p = (A*)operator new(sizeof(A));
	new(p)A(5);
	p->~A();
	operator delete(p) ;

	A* p2 = (A*)operator new[](sizeof(A) * 10);
	for (int i = 0; i < 10; ++i)
	{
		new(p2 + i)A(i);
	}
	for (int i = 0; i < 10; ++i)
	{
		(p2 + i)->~A();
	}
	operator delete[](p2);
	return 0;
}

3.常见面试题

3.1 malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:
1.malloc和free是函数,new和delete是操作符
2.malloc申请的空间不会初始化,new可以初始化
3.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,
如果是多个对象,[]中指定对象个数即可
4.malloc的返回值为void, 在使用时必须强转*,new不需要,因为new后跟的是空间的类型
5.malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需
要捕获异常
6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new
在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

4.泛型编程

//泛型编程
template<typename T>

void Swap(T& a, T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}

5.函数模板

5.1函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

5.2 函数模板格式

template<typename T1, typename T2,…typename Tn>
返回值类型 函数名(参数列表){}

5.3函数模板实例化

1.显示实例化

//显示实例化
int main()
{
	int a1 = 10, b1 = 20;
	double c1 = 10.1, d1 = 20.2;
	Add(a1, b1);
	Add(c1, d1);
cout << Add<int>(a1, c1) << endl;//c1隐式类型转换城int
cout << Add<double>(b1, d1) << endl;

5.4函数模板的匹配原则

1.都有的情况,优先匹配普通函数+参数匹配(成品+口味对)
2.没有普通函数,优先匹配参数匹配+函数模版(半成品+口味对)
3.只有一个,类型转换一下也能用,也可以匹配调用(口味不对,将就一下也行)

int Add(const int& left, const int& right)
{
	cout << "(const int& left, const int& right)" << endl;
	return left + right;
}

template<class T>
T Add(const T& left, const T& right)
{
	cout << "(const T& left, const T& right)" << endl;
	return left + right;
}

template<class T1,class T2>

auto Add(const T1& left, const T2& right)
{
	cout << "(const T1& left, const T2& right)" << endl;
	return left + right;
}

int main()
{
	int a1 = 10, b1 = 20;
	double c1 = 10.1, d1 = 20.2;
	Add(a1, b1);
	/*Add(c1, d1);*/

	//显示实例化
	cout << Add<int>(a1, c1) << endl;//c1隐式类型转换城int
	cout << Add<double>(b1, d1) << endl;
	//显示实例化,当两个参数类型不同时,使它有机会调用第一个模板



	cout << Add(a1, d1) << endl;
	return 0;
}

6.类模板

6.1类模板

template<class T>
class Stack
{
public:
	Stack(size_t capacity = 3)
		//会先初始化列表初始化成员变量
	{
		cout << "Stack(size_t capacity = 3)" << endl;
		_array = (T*)malloc(sizeof(T) * capacity);
		if (_array == NULL)
		{
			perror("malloc failed");
			return;
		}
		_capacity = capacity;
		_size = 0;
	}
	void Push(const T& x);
	
	~Stack()
	{
		cout << "~Stack()" << endl;//用来检验有没有调用析构函数

		if (_array)
		{
			free(_array);
			_array = NULL;
			_capacity = 0;
			_size = 0;
		}
	}
	Stack(Stack& st1)
	{   //进行深拷贝,空间和内容都要相同
		_array = (T*)malloc(sizeof(T) * st1._capacity);
		if (_array == NULL)
		{
			perror("malloc failed");
			return;
		}
		memcpy(_array, st1._array, sizeof(T) * st1._size);
		_capacity = st1._capacity;
		_size = st1._size;


	}

private:
	T* _array;
	int _capacity;
	int _size;
};

6.2类模板声明与定义分离

void Stack<T>::Push(const T& x)//类型为Stack<T>
{
	// CheckCapacity();
	_array[_size] = x;
	_size++;
}

模板不建议声明与定义分离到.h和.cpp,会出现链接错误。

好啦,今天的博客就介绍到这里啦!觉得博主写的不错的,记得留下你的三连哦,谢谢你的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/572310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

短链接推荐:一个可以监测用户行为的“营销神器”

客户对我的推广有兴趣吗&#xff1f;他喜欢我的产品吗&#xff1f;他打开了我的营销信息吗&#xff1f;这三个问题相信每一位推广者都遇到过。接下来&#xff0c;就将给大家介绍一位大聪明——它能帮你监测每一位用户的行为&#xff0c;让你分分秒秒掌握用户的心理&#xff01;…

consul服务注册与发现、服务配置与刷新

为什么要用服务注册&#xff1f;为什么要用consul不用eureka&#xff1f; 举个栗子&#xff1a; 微服务当中存在多个服务模块&#xff0c;每个服务模块的ip端口在每套环境是不一致的&#xff0c;开发切换环境部署时&#xff0c;如果漏了一个配置忘记改动&#xff0c;将是一个很…

黑龙江—等保测评三级安全设计思路

需求分析 6.1、 系统现状 6.2、 现有措施 目前&#xff0c;信息系统已经采取了下述的安全措施&#xff1a; 1、在物理层面上&#xff0c; 2、在网络层面上&#xff0c; 3、在系统层面上&#xff0c; 4、在应用层面上&#xff0c; 5、在管理层面上&#xff0c; 6.…

数码摄影色彩构成,数码相机色彩管理

一、资料描述 本套摄影色彩资料&#xff0c;大小58.54M&#xff0c;共有6个文件。 二、资料目录 《抽象彩色摄影集》.阿瑟.pdf 《色彩构成》.pdf 《色彩学》.星云.扫描版.pdf 《摄影色彩构成》.pdf 《数码相机色彩管理》.pdf 数码摄影进阶之4《色彩篇》.pdf 三、资料下…

【PCL】教程narf_feature_extraction 如何从深度图像中提取 NARF 特征

如何从范围图像中提取 NARF 特征  本教程演示如何从深度图像中在 NARF 关键点位置提取 NARF 描述符。该可执行文件使我们能够从磁盘加载点云&#xff08;或创建它&#xff0c;如果没有提供&#xff09;&#xff0c;在其上提取兴趣点&#xff0c;然后在这些位置计算描述符。然…

spring @value @configurationProperties比较

今天项目中需要使用数组的方式 来加载一批 配置 yml: xxxx: - xxxxx - xsssss javaBean Value("${xxxxx.xxxxx}") private List<String> xxxs; 启动时候报错&#xff0c;无法加载&#xff0c;TM试验了1个小时&#xff0c;我一开始想到是格式的问题&#x…

Android 10.0 Launcher3替换桌面app图标后大小和其他app图标不一样的问题解决方案

1.前言 在10.0的系统ROM产品定制化开发中,在关于launcher3的产品定制化开发中,在有些时候需要对一些第三方的app图标做 替换或者是做一些动态图标的替换,发现在替换以后图标大小和其他app的图标大小不一样,所以就需要看是具体哪里 对app的图标做了缩放功能,接下来就需要去…

【注解和反射】类加载器

继上一篇博客【注解和反射】什么时候类会和不会被初始化&#xff1f;-CSDN博客 目录 六、类加载器 测试&#xff1a;获得类加载器 &#xff08;1&#xff09;如何获取Java中的类加载器及其父类加载器 &#xff08;2&#xff09;测试当前类是哪个类加载器 &#xff08;3&am…

【C++】STL-vector模拟实现

目录 1、vactor的模拟实现 1.1 成员变量 1.2 size、capacity 1.3 迭代器 1.4 构造、析构、拷贝构造、operator 1.5 push_back、pop_back、reserve 1.6 operator[] 1.7 insert、erase 1.8 resize 2、使用memcpy拷贝问题 1、vactor的模拟实现 1.1 成员变量 vector是顺…

时尚新选择,小塔RFID技术重塑样衣管理

在时尚领域&#xff0c;样衣是创意与工艺的完美结合&#xff0c;每一件都承载着设计师的心血与期待。然而&#xff0c;当这些珍贵的样版在传统的管理体系下流转时&#xff0c;样版管理成为一个令人头疼的问题。手动记录、盘点和样板追溯成为常态&#xff0c;但这种方式容易出错…

机器学习(二)之监督学习

前言&#xff1a; 上一节大概讲解了几种学习方式&#xff0c;下面几张就具体来讲讲监督学习的几种算法。 以下示例中和都是权重的意思&#xff01;&#xff01;&#xff01; 注&#xff1a;本文如有错误之处&#xff0c;还请读者指出&#xff0c;欢迎评论区探讨&#xff01; 1…

17. map和set的模拟实现(也就是用红黑树封装map和set)

1.map和set底层调用的红黑树的实现 有不清楚的地方&#xff0c;参考AVL树的模拟实现和红黑树的模拟实现 红黑树迭代器的实现 // 红黑树迭代器的类模板 template<class T, class Ref, class Ptr> struct __RBTreeIterator {// 将红黑树节点的类类型定义为Nodetypedef R…

绽放新笑容:儿童换牙期的关怀与注意

引言&#xff1a; 儿童的换牙期是成长过程中的重要阶段&#xff0c;标志着他们逐渐迈向成人世界。然而&#xff0c;伴随着牙齿的脱落和新牙的生长&#xff0c;孩子们可能会经历一些不适和困扰。本文将探讨儿童换牙期的注意事项&#xff0c;以帮助家长和孩子们度过这一特殊时期&…

扎根理论分析原理、方法与Nvivo技术应用

扎根理论越来越流行&#xff0c;成为经常被采用的研究方法之一。扎根理论的研究者来自广泛的研究领域&#xff0c;例如社会工作、护理、医药、综合医疗保健、教育、管理和商业。这些从业者和学者试图从他们所在学科范围内解释行为模式。对于扎根理论本质和实践的研究引发了知名…

这个表格为什么在VS Code里面预览可以显示,在浏览器预览就没有显示

在VS Code里面预览可以显示如图&#xff1a; 在浏览器预览就不能显示了&#xff0c;刚开始还好的后来不知道弄错了哪里了&#xff0c;哭死 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"vi…

Swagger:在线接口文档

Swagger介绍及使用 官网:https://swagger.io/ 介绍 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。 Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 使用方式 1.导入 kni…

qt5-入门-QListWidget-通过右键快捷菜单复制item内容

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 效果 在某个item上右键&#xff0c;点击copy后&#xff0c;item的内容已复制到剪贴板。 实现 #include <QMenu> #include <…

如何用微信发布考试成绩(如月考、期中、期末等)

自教育部《未成年人学校保护规定》颁布后,教育部明确表示:学校不得公开学生的考试成绩、排名等信息!同时学校应采取措施,便利家长知道学生的成绩等学业信息,对于教师来说,如何用微信发布考试成绩(如:月考、期中、期末等)就成了一道难题... 公开吧,会伤害到学生自尊心,甚至被投诉…

创建钉钉审批流实例

1、依赖 <!--钉钉 api --> <dependency><groupId>com.aliyun</groupId><artifactId>dingtalk</artifactId><version>2.0.14</version> </dependency> <!--钉钉 事件订阅--> <dependency><groupId>co…

CUDA编程技术概述

CUDA&#xff08;Compute Unified Device Architecture&#xff0c;统一计算设备架构&#xff09;是由英伟达&#xff08;NVIDIA&#xff09;公司推出的一种软硬件集成技术&#xff0c;是该公司对于GPGPU&#xff08;通用图形处理器计算&#xff09;的正式名称。透过这个技术&a…
最新文章