03 new操作符
在 c++中,可以使用new
操作符在堆区开辟数据。
堆区数据的开辟:由开发手动开辟,手动释放。释放使用操作符delete
。如果不释放,将会在程序运行结束之后由操作系统自动释放。
语法:创建:new 数据类型
删除:delete 地址
利用new
创建的数据,会返回这个数据对应类型的指针。
#include <iostream>
using namespace std;
int* func1()
{
int* p = new int(100); //创建
return p;
}
void main()
{
int* p = func1();
int a = *p;
cout << a << endl;
delete p; //删除
}
运行结果:
100
在堆区中存放数组:
#include <iostream>
using namespace std;
void main()
{
int* arr = new int[10]; //数组有10个元素。
for (int i = 0;i < 10;i++)
{
arr[i] = i;
}
for (int i = 0;i < 10;i++)
{
cout << arr[i];
}
delete[] arr; //释放数组的时候需要加上中括号
}
结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
0123456789
这边有注意的点:使用new
创建单个数据的时候,使用的是小括号()
。而创建数组的时候,使用的是中括号[]
。如下所示:
int* p1 = new int(10);
int* p2 = new int[10];
int* p1 = new int(10);
表示:p1
存放10
所在的地址
int* p2 = new int[10];
表示:p2
存放连续的 10 个 int 类型所在的地址。使用地址访问的时候,和数组一样,p2[0]
就表示是p2
中的第一个。
删除的时候是使用delete 空间地址
。如果是删除一个数据,那么只要delete
即可。如果删除的是数组,需要在 delete 后添加方括号,比如这样:delete [] 空间地址
。
int* p1 = new int(10);
int* p2 = new int[10];
delete p1;
delete[] p2;
请注意,new
操作符获得的是一个存放在堆区的内存地址。简而言之,使用new
创建的对象是指针,需要使用解引用的方式才可以获取到真实的数据。
比如下面一段代码:
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int* b = new int(20);
cout << "a 的输出结果是:" << a << endl;
cout << "b 的输出结果是:" << b << endl;
return 0;
}
结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
a 的输出结果是:10
b 的输出结果是:000002165A429380
:-)