C分配和释放动态内存的堆内存;new与delete用法

前言:

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 是一个特定的类型,就像 basic_string 和 string 的关系一样

double *p = new double;
double *pp = new double(3.14);
vector *ppp = new vector{1,2,3};

用法二:TypeName ∗pointer=new TypeName[size]() TypeName ∗pointer=new TypeName[size]{} 用法二:\ \ \ \ \ \ TypeName\ \ *pointer=new\ \ TypeName[size]() \\ TypeName\ \ *pointer=new\ \ TypeName[size]\{\}用法二: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 *ppp = new vector[2]{{1,2,3},{1,2,3}};

新细节:

细节一:用法一:默认情况下,动态分配内存的对象默认初始化,调用默认构造函数;

细节二:用法一:()调用对应的构造函数;

细节三:用法一:可以使用语法糖auto with (),auto会自行推断()中的类型,但只能有一个初始化器;

细节 4:动态分配的 const 对象必须显式初始化指针类型可以随便强制转换吗,并且可以为(显式)定义默认构造函数的类型隐式初始化;

细节5:内存耗尽时抛出异常,分配失败返回空指针;

细节6:动态分配空数组是合法的;

图片[1]-C分配和释放动态内存的堆内存;new与delete用法-老王博客

删除:

释放new分配的对象内存,delete obj_pointer,释放new分配的数组,delete[] obj_pointer。

细节:obj_pointer必须指向新的动态分配的内存或者空指针,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)); 分配内存以获得通用指针,呼应主题,malloc(n) 将在 operator new() 中被调用,其中 n=sizeof(AA) ;

第二步是:pc = static_cast mem类型转换;将获得的泛型指针转换为AA类型的指针;

第三步:pc->AA::AA(1,1);调用构造函数初始化AA;

删除的详细过程:

例子:

delete AA;

删除过程比较简单:

第一步:AA::~AA(pc); 调用析构函数;

第二步:operator delete(pc); 释放内存,呼应主题,operator delete()会调用free(),即free(pc);

为什么数组 new 应该与数组删除一起使用?

实际上,数组new分配的内存并不等于size*sizeof(class)。在 32 位机器分配的内存的顶部,有一个 4 字节的内存(cookies)用来统计数组的大小,会根据 count 来计算准确的释放内存,如果内存数组new分配的使用delete释放内存,内存也会根据计数准确释放指针类型可以随便强制转换吗,但析构函数只会被调用一次。如果析构函数中包含释放其他类型的delete,那么这时候就会造成内存泄漏,因为只调用了数组第一个对象的析构函数,只会释放第一个析构函数中的delete,而休息会导致内存泄漏!!!

今天的文章就到这里,欢迎大家批评指正;

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论