对象动态建立和释放 new 和delete
在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。
new和delete是运算符,不是函数,因此执行效率高。
虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。
new int;//开辟了一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) new int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址 new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址 new int[5][4];//开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址 float *p = new float(3.14158);//开辟一个存放单精度数的空间,并指定该实数的初值为3.14158,将返回该空间的地址赋给指针变量p
new运算符动态分配堆内存
使用形式:指针变量=new 类型(常量);
指针变量=new 类型[表达式];
作用:从堆分配一块“类型”大小的存储空间,返回首地址
其中:“常量”是初始化值,可缺省
创建数组对象时,不能为对象指定初始化值
delete运算符释放已分配的内存空间
使用形式:delete 指针变量;
delete[] 指针变量;
其中:“指针变量”必须是一个new返回的指针
用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。
malloc不会调用类的构造函数,而new会调用类的构造函数;
free不会调用类的析构函数,而delete会调用类的析构函数。
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //C语言中 void test1() { int *p = (int*)malloc(sizeof(int)); *p = 10; if (p != NULL); { free(p); p = NULL; } int *array_p = (int*)malloc(sizeof(int) * 10);//数组 for (int i = 0; i < 10; i++) { array_p[i] = i + 1; } for (int i = 0; i < 10; i++) { printf("%d ", array_p[i]); } printf(" "); } //C++语言中 void test2() { int *p = new int; *p = 10; if (p != NULL) { delete p; p = NULL; } int *array_p = new int[1for (int i = 0; i < 10; i++) { array_p[i] = i + 1; } for (int i = 0; i < 10; i++) { cout << array_p[i] << " " ; } cout << endl; if (array_p!= NULL) { delete[] array_p; } } int main(void) { test1(); cout << "-----------------------" << endl; test2(); return 0; }