C++ new
与delete
在C
语言中,动态分配内存时一般常使用malloc()
函数,但是对于非内置数据类型(如struct
、enum
、class
),
malloc()
与free()
无法满足动态对象的需求,因此C++
引入new
与delete
关键字,用来进行内存申请与释放空间。
1.new
运算符
new
运算符用来申请一块连续的内存,其格式如下:
new 数据类型(初始化列表)
malloc()
函数申请内存时返回一个void*
类型的指针,而new
与malloc()
不同,它分类一块存储空间并且指定了类型信息,并根据初始化列表中给出的值进行初始化,
是直接可以使用的内存,这个过程,常称为new
一个对象
。而且new
动态创建对象不必为该对象命名,直接指定数据类型即可。如果申请内存成功,返回一个类型指针,如果内存申请失败,则返回NULL
。
用new
创建基本数据类型对象,示例代码如下:
char *pc = new char;//申请一段空间用来存储`char`类型,内存中没有初始化值
intg *pi = new int(10);//申请一段空间存储`int`类型数据,初始化值为`10`
double *pd = new double();//申请一段空间存储`double`类型的数据,默认初始化值为`0`
上述代码分别用new
创建了char
、int
、double
三个对象,其中char
对象没有初始化列表,新分配内存中没有初始化值;int
对象初始化列表为10
,是分配一个空间存储int
类型数据,并把10
存入该空间;double
对象初始化
列表为空,表示用0初始化该对象。
new
数组时,后面可以加小括号()
,但括号中不可以有指定任何初始值,加小括号时由编译器为其提供默认初始值,而不加小括号时不提供任何初始值。例如:
int *pi = new int[10]();
char *pc = new char[10];
double *pd = new double[0];
pi
所指向的数组中10
个元素初始化为0
,pc
所指向的数组中没有提供初始值,而pd
是一个长度为0
的double
类型数组,C++
中不允许定义长度为0的数组变量,但明确指出,调用new
创建长度为0
的数组是合法的。它返回有效的非零指针,但该指针不能进行有效的解引用操作,因为其没有指向任何元素,它主要的作用是用于比较运算。
除了上述数组创建外,new
还可以创建const
对象的动态数组,但是const
对象数组一旦创建就不能更改,因此意义不大,只需要知道即可。
2.delete运算符
用new运算符分配内存,使用后要及时释放以免造成内存泄露,C++
提供了delete
运算符来释放new
出来的内存空间,其格式如下:
delete 指针名;
直接作用域指针就可以删除由new
创建的对象,释放指针所指向的内存空间,但是在释放数组对象时要在指针名前面加[]
,其格式如下:
delete []指针名;
如果漏掉了[]
,编译器在编译时无法发现错误,但它会导致少释放内存空间,产生内存泄露严重时会产生运行错误等。
实例:
#include<iostream>
using namespace std;
int main(){
int *pi = new int(10);
cout << "*pi = " << *pi << endl;
char *pc = new char[10];
for(int i = 0; i<10; i++)
pc[i] = i + 65;//向数组中存入元素
for(int i = 0; i < 10; i++)
cout << pc[i] << " ";
cout << endl;
delete pi; //释放int对象
delete [] pc;//释放数组对象
system("pause");
return 0;
}
结果: