new:
1.调用operator new 申请空间
void * operator new(size_t size)
{
while(nulltr == p==malloc(size); )
a.申请成功,直接返回
b.申请失败,检测用户是否设置空间不足的应对措施(函数指针)
设置:继续循环申请,直到申请成功
未设置:剖析异常
2.调用构造函数对申请成功的空间进行初始化
delete p:p所指向的一定是new堆内存空
调用对应的析构函数释放对象中的资源
调用void operator delete(void* p)
malloc底层实现原理
new/delete和new[]/delete[]
new T:
1.调用void *operator new(size_t size)
{malloc循环申请–>申请成功,直接返回
申请失败–提供空间不足的应对措施(用户提供)
提供:循环申请
未提供:抛异常
}
例子:学生向家中要生活费 家中有钱-给 家中没钱-a. 有条件的情况下,向别人借 b.实在没有办法的话,不借
delete:
1.调用T的析构函数释放对象中的资源
2.void operator delete()释放对象的空间
new T[N]
1.申请空间:void* operator new[](size_t size)—>void* operator new(size_t size)—>循环采用malloc进行申请
2.构造N个对象:调用N构造函数初始化对象
delete[]
1.释放N个对象中的资源:调用N次析构函数
2.释放N个对象的空间:void operator delete[](void* p)—>void operator delete(void* p)—>free
定位new表达式:对已经存在的空间进行初始化
new( p ) T(参数)
1.调用void* operator new(size_t size,void* where)
{
return where;
//不需要真正申请空间,直接将空间返回
}
2.调用T类型的构造函数
模版
1.什么是模版?什么是泛型编程?
写一些与类型无关的代码,通俗一点说就是一个造东西的模具,只要给不同的材质,就会出现相对应材质的东西。
模具-----塑料-----塑料实体
函数模版/类模板----实例化----实体:处理具体类型的函数或者类
泛型是通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
泛型的优点:
- 可以做到最大的代码重用、保护类型的安全以及提高了程序运行的性能;
- 可以创建集合类;
- 可以创建自己的泛型接口、泛型方法、泛型类、泛型事件和泛型委托。
- 可以对泛型类进行约束,以访问特定数据类型的方法。
- 关于泛型数据类型中使用的类型的信息,可在运行时通过反射获取。
模版是泛型编程实现的一种手段。
2.函数模版