本文介绍: operator newoperator delete系统提供的全局函数new底层调用operator new函数来开辟空间delete底层调用operator delete函数实现释放空间。由于c++兼容c,因此c的内存管理方式在c++中依旧可以使用,但其不能解决自定义类型初始化问题new在为一个自定义类型开辟空间时会调用构造函数进行初始化delete在释放自定义类型的空间时也会调用其析构函数来对其内容进行清理。1.malloc和free函数,new和delete操作符

c++内存分布

在这里插入图片描述
const修饰变量并不会因为其具有属性而将其放到常量区,const起的作用只是将其修饰成不可修改而已。

char s[]="abcd";//将常量区的内容复制数组s
const char *p="abcd";//将指针p指向常量区的内容

new和delete

类似于C语言malloc和free,c++提出了自己内存管理方式

int *p1=new int;//开辟一个整型空间,new对内置类型不会初始化
int *p2=new int(11);//开辟一个整型空间并初始化成11
delete p1;
delete p2;//释放空间

int *p3=new int[3];//开辟3个连续的整型空间
int *p4=new int[10]{1,2,3};//开辟10个连续的整型空间并初始化,剩余未初始化的空间初始化成0
delete[] p3;
delete[] p4;//释放空间

需要注意的是,为了避免一些意想不到的错误,new和delete配套使用,new[]和delete[]配套使用,不能混合使用

由于c++兼容c,因此c的内存管理方式在c++中依旧可以使用,但其不能解决自定义类型的初始化问题,new在为一个自定义类型开辟空间时会调用其构造函数进行初始化,delete在释放自定义类型的空间时也会调用其析构函数来对其内容进行清理

operator new和operator delete

operator new和operator delete是系统提供的全局函数,new在底层调用了operator new函数来开辟空间,delete在底层调用operator delete函数来实现释放空间。这2个函数用户可以直接使用,但其目的不是为了供用户使用,而是用于new和delete。
operator new的空间申请其实是通过malloc函数实现的,operator delete空间的释放也其实是通过free函数实现的。这样层层封装的主要原因malloc函数开辟空间失败后会返回0,不符合c++面向对象编程我们希望空间开辟失败后会抛异常,因此我们就在malloc函数的基础上,加上了一个空间开辟失败异常功能然后将其封装成operator new函数。operator delete和free没有什么区别,其主要是为了和operator new函数对称。

new和delete实现原理

以下以自定义类型为例

new原理
先调用operator new函数开辟空间,再调用构造函数初始化。

delete原理:
先调用析构函数完成对对象资源的清理,再调用opeartor delete函数释放对象的空间。

new[]原理:
先调用operator new[]函数,再调用N次构造函数对N对象初始化,而operator new[]其实是通过调用operator new函数一次性开辟完N个对象的空间。

delete[]原理:
先调用N次析构函数完成对N个对象资源的清理,再调用operator delete[]函数释放空间,operator delete[]函数实际又是通过operator delete函数释放空间。

mallloc/free与new/delete区别

1.malloc和free是函数,new和delete是操作符
2.malloc函数申请的空间不能初始化,new可以
3.malloc需要手动计算需要开辟空间的大小,new不需要
4.malloc返回类型是void*,使用需要类型转换,new不需要
5.malloc空间申请失败返回空指针,使用时要判空,new不需要
6.new可以调用构造函数初始化,delete可以调用析构函数进行资源清理,而malloc和free不能。

原文地址:https://blog.csdn.net/m0_74494481/article/details/134748478

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_25682.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注