C++中对new与delete的简单理解
我们可以知道,指针与数组具有相似性,但两者之间是有区别的,数组在定义时就根据指定的大小分配好了内存空间,而指针只是一个变量。那么如何给指针分配一片内存空间呢?
下面我们将介绍的new运算符可以实现这一功能,他与delete运算符一起使用,以达到直接进行动态内存分配和释放的目的。
·
·
运算符new返回指定类型的一个指针,如果分配失败(如没有足够的空间),则返回0.例如:
double *p;
p=new double;
系统自动根据double类型的空间大小开辟一个内存单元,并将地址放在指针p中。运算符delete操作是释放new请求到的内存,例如:
delete p;
·
·
需要注意以下几点:
**(1)**运算符delete必须用于先前new分配的有效指针,如果使用了未定义的其他任何类型指针,就会带来严重的问题,如系统崩溃。
·
**(2)**用new也可以指定分配内存的大小,例如:
int *p;
p=new int(60);//为指针开辟60个字节的内存单元
……
delete p;
·
**(3)**new可以为数组分配内存,但当释放时,必须告诉delete数组有多少个元素。例如:
int *p;
p=new int(10);
if(!p)
{
cout<<"内存分配失败";
exit(1); //中断程序的执行
}
for(int i=0;i<10;i++)
p[i]=i; //给数组赋值
……
delete [10]p; //告诉delete数组有多少个元素
前面已经定义了数组【10】所以在删除delete的时候前面要加上【10】
·
·
·
【例题】分析下列程序的错误并且改正
#include<iostream>
#include<cstring.h>
void main()
{
char *p;
strcpy(p,"China!");
cout<<p<<endl;
}
解答:在上述的程序中,但我们遇到char *p的语句时,给变量分配一个地址单元(在32位机上为4个字节),并没有分配p所指向的数据空间,并执行strcpy(p,“China”)语句时,并不能确定把字符串“China!”放在内存中的什么地方,因此程序会出现错误。
改正的方法是使用new先分配p所指向的内存空间,再将字符串放到这个内存空间中,并由p所指向第一个字符位置,修改后程序如下:
#include<iostream>
#include<cstring.h>
void main()
{
char *p;
p=new char[10];
strcpy(p,"China!");
cout<<p<<endl;
}
·
·
·
——文章转载至书本资料,仅用于个人学习
——2021年4月19日20:51