C++ new与delete

发布时间 2023-12-18 15:32:36作者: Bonne_chance

C++ newdelete

C语言中,动态分配内存时一般常使用malloc()函数,但是对于非内置数据类型(如structenumclass),
malloc()free()无法满足动态对象的需求,因此C++引入newdelete关键字,用来进行内存申请与释放空间。
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;
}

结果: