前言:
C分配和释放动态内存的方式分别是malloc与free,malloc用于分配堆内存,free用于释放堆内存;
C++定义了两个运算符来分配和释放动态内存,运算符new分配堆内存,运算符delete释放new分配的堆内存;
1、new与delete用法简单介绍
new:
用法一: TypeName ∗pointer=new TypeName()用法一:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ TypeName\ \ *pointer=new\ \ TypeName()用法一: TypeName ∗pointer=new TypeName()
末尾小括号()可有可无,动态分配内存的对象是默认初始化的,调用默认构造函数,()用于初始化的,new返回TypeName类型的指针
,如:
vector是泛型类模板,vector<int>是具体类型就与basic_string与string的关系一样
double *p = new double;
double *pp = new double(3.14);
vector<int> *ppp = new vector<int>{1,2,3};
用法二: TypeName ∗pointer=new TypeName[size]()TypeName ∗pointer=new TypeName[size]{}
末尾小括号()与{}可有可无,没有的话是未初始化的,()小括号表示
值初始化,{}采用的是
列表初始化,若列表元素数目N小于size,前N个初始化器初始化,后size-N个值初始化,大于size会报错,new返回第一个变量的指针,类型为TypeName
,如:
double *p = new double[10];
double *pp = new double[10]{3.14};
vector<int> *ppp = new vector<int>[2]{{1,2,3},{1,2,3}};
new的细节:
细节一:用法一:默认情况下,动态分配内存的对象是默认初始化的,调用默认构造函数;
细节二:用法一:()调用相应的构造函数;
细节三:用法一:与()搭配可以用语法糖auto,auto会自行推断()里的类型,但只能有单个初始化器;
细节四:动态分配的const对象必须显示初始化,对于一个(显示)定义了默认构造函数的类型可以隐式初始化;
细节五:内存耗尽会抛出异常,分配失败会返回空指针;
细节六:动态分配一个空数组是合法的;
delete:
释放new分配的对象内存,delete obj_pointer
,释放new分配的数组,delete [] obj_pointer
。
细节:obj_pointer必须指向new动态分配的内存或空指针,delete会调用析构函数
2、new与delete分配堆内存的细节过程
new的细节过程:
示例:
class AA { public: AA(int x,int y){} }; AA *pc=new AA(1,1);
AA *pc=new AA(1,1);
会转变为三个过程:
第一步为:void* mem = operator new(sizeof(AA));分配内存得到泛型指针,呼应主题的来了,operator new()内部会调用malloc(n),其中n=sizeof(AA);
第二步为: pc = static_cast<AA*> mem 强制类型转换;把得到的泛型指针转换为AA类型的指针;
第三步为:pc->AA::AA(1,1);调用构造函数初始化AA;
delete的细节过程:
示例:
delete AA;
delete的过程比较简单:
第一步:AA::~AA(pc);调用析构函数;
第二步:operator delete(pc);释放内存,呼应主题的来了,operator delete()会调用free(),即free(pc);
array new 为什么要搭配array delete呢?
其实array new分配出来的内存并不等于size*sizeof(class)在其顶部在32位机中分配的内存顶部有一个4个字节大小的内存(cookies)用来count数组的大小,会根据count去准确释放内存,如果array new分配出来的内存用delete去释放内存,也会根据count去准确释放内存,但只会调用一次析构函数,如果这个析构函数里含有释放其他类型的delete,那么此时就会造成内存泄漏,因为只调用了数组第一个对象的析构函数,只会释放第一个析构函数里的delete,剩余部分将会造成内存泄漏!!!
今天的文章就到这里了,欢迎大家批评指正;
作者:勿在浮沙築高台
链接:https://juejin.cn/post/6993340966459408398
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
共同学习,写下你的评论
评论加载中...
作者其他优质文章