上次堆区的介绍中,我们提到了一个关键字new,那今天我们就详细讲讲它
今天我们主要将两个内容
1.new的基本语法
2.用new创建数组
1.new的基本语法
new,可以在堆区中创建空间,来存放数据,就比如像下面这样
int* p = new int(29);//new会返回空间的地址,所以要用相同类型的指针变量接收
基本上用new创建变量的格式:指针类型+指针变量名=new+变量类型+(赋值)
那我们已经知道了怎么创建,现在我们再来讲讲释放,就像fopen打开的文件要用,fcolse来关闭,malloc,calloc,realloc动态分配的空间,要用free来释放一样,new在堆区中创建的空间也需要delete来删除(释放)
delete p;//释放new在堆区创建的变量
我们可以先用new来创建空间,在释放的前后打印看一下,会有什么效果:
#include<iostream>
using namespace std;
//new的基本语法
int* asd()
{
//在堆区开辟空间
int* p = new int(29);//new会返回空间的地址,所以要用相同类型的指针变量接收
return p;
}
void fff()
{
int* p = asd();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
delete p;//释放new在堆区创建的变量
//cout << *p << endl;
}
int main()
{
fff();
return 0;
}
在释放前:
我们可以看到,很成功的打印出来了并没有乱码出现 ,那接下来我们在看看释放后的打印结果:
我们可以看到,释放前的打印完了之后,就无法打印了,并出现了访问权限冲突的问题,这证明了new所创建的空间成功被释放了。
2.用new创建数组
而用new创建一个数组,其实也是异曲同工之妙,只不过细节上有点区别
int* arr = new int[10];//注意:与创建单个变量不同,它赋值时使用的并不是小括号,而是中括号
用new创建一个数组的基本公式可以概括为: 指针类型+指针数组名=new+变量类型+[元素个数]
注意:与创建单个变量不同,它赋值时使用的并不是小括号,而是中括号
那么释放呢?
delete[] arr;//new在堆区中创建的数组与变量释放的格式是不一样的,数组比变量要多一个中括号。
这里呢,它多了一个中括号,表示它是在释放一个数组。
接下来,我们在上面的代码的基础上,创建一个数组,同样在释放前后打印,看看结果是不是一样的。
#include<iostream>
using namespace std;
//new的基本语法
int* asd()
{
//在堆区开辟空间
int* p = new int(29);//new会返回空间的地址,所以要用相同类型的指针变量接收
return p;
}
void fff()
{
int* p = asd();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
delete p;//释放new在堆区创建的变量
//cout << *p << endl;
}
//运用new在堆区创建数组
void fds()
{
int* arr = new int[10];//注意与创建单个变量不同,它赋值时使用的并不是小括号,而是中括号
//为数组赋值
for (int i = 0; i < 10; i++)
{
arr[i] = i + 100;//将arr当作数组名加个中括号就可以了,正常结果就是100-109了
}
//我们来看看赋值是否成功呢?
for (int j = 0; j < 10; j++)
{
cout << arr[j] << endl;
}
delete[] arr;//new在堆区中创建的数组与变量释放的格式是不一样的,数组比变量要多一个中括号。
/*for (int j = 0; j < 10; j++)
{
cout << arr[j] << endl;
}*/
}
int main()
{
fff();
fds();
return 0;
}
释放前:
释放后:
同样的话我就不再这里水字数了 ,希望大家有所收获
完