C++_13_ new 和 delete 基本语法 - 重写版
new 和 delete 操作符
1 、(C ) 库函数: malloc free malloc() 函数具有分配存储空间的功能,但除了分配存储空间外,不会调用类的构造函数。 free() 函数可以释放对象存储空间,同样不会调用析构函数。
(C++)运算符: new delete new 和 new[] 操作符则不会如此,使用它们为对象分配存储空间的同时,它们也会调用相应的构造函数。操作符 delete 和 delete[] 在释放对象存储空间的同时也会调用析构函数
2、new 和 delete 是运算符,不是函数,因此执行效率高
3、虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符
new语法:
new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10]; //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p
delete p; //释放指针p指向的内存空间
- new运算符动态分配堆内存
使用形式:指针变量=new类型(常量) ;
指针变量=new类型[表达式];
作用:从堆分配-块“类型”大小的存储空间,返回首 地址
其中:“常量”是初始化值,可缺省
创建数组对象时,不能为对象指定初始值 -
delete运算符释放已分配的内存空间
使用形式:delete 指针变量;
delete[]指针变量;
其中:“指针变量”必须是一个new返回的指针
用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。
C++中,可以用new运算符动态建立对象,用delete运算符撤销对象
Box *pt; //定义一个指向Box类对象的指针变量pt
pt=new Box; //在pt中存放了新建对象的起始地址
在程序中就可以通过pt访问这个新建的对象。如
cout<<pt->height; //输出该对象的height成员
cout<<pt->volume( ); //调用该对象的volume函数,计算并输出体积
C++还允许在执行new时,对新建立的对象进行初始化。如
Box *pt=new Box(12,15,18);
这种写法是把上面两个语句(定义指针变量和用new建立新对象)合并为一个语句,并指定初值。这样更精炼。
新对象中的height,width和length分别获得初值12,15,18。调用对象既可以通过对象名,也可以通过指针。
在执行new运算时,如果内存量不足,无法开辟所需的内存空间,目前大多数C++编译系统都使new返回一个0指针值。只要检测返回值是否为0,就可判断分配内存是否成功。
ANSI C++标准提出,在执行new出现故障时,就“抛出”一个“异常”,用户可根据异常进行有关处理。但C++标准仍然允许在出现new故障时返回0指针值。当前,不同的编译系统对new故障的处理方法是不同的。
在不再需要使用由new建立的对象时,可以用delete运算符予以释放。如delete pt; //释放pt指向的内存空间,这就撤销了pt指向的对象。此后程序不能再使用该对象。
如果用一个指针变量pt先后指向不同的动态对象,应注意指针变量的当前指向,以免删错了对象。在执行delete运算符时,在释放内存空间之前,自动调用析构函数,完成有关善后清理工作。
//1 malloc free函数 C函数
// new delete 操作符号 C++的关键字
//2 new 在堆上分配内存 delete
// 分配基础类型 、分配数组类型、分配对象
//3 new和malloc 深入分析
混用测试、异同比较
结论: malloc不会调用类的构造函数
Free不会调用类的析构函数
new可以给如下类型申请空间并返回地址:
- new给基本类型变量变量申请空间;
int *p = new int(100); // *p = 100 - new给数组申请空间;
char *arr = new char[32]; //可以直接接{'z','h','a','i'} 进行赋值操作,直接接字符串? - new给类的对象申请空间;
Person *p = new Person; //申请成功就会 自动调用类的构造函数
顺便提一下对象数组的概念
Person arr1[5]; //定义的是个数组,每个元素都是类的对象 //定义对象的时候会自动调用无参构造函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通