C++中利用new操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete
语法:new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针
开辟单个内存
语法:new 数据类型(初始值)
#include <iostream>
using namespace std;
int* get_num()
{
int* a = new int(10);
return a;
}
int main()
{
int* res = get_num();
cout<<*res<<endl;
delete res;
return 0;
}
开辟数组
#include <iostream>
using namespace std;
int main()
{
// 开辟一维数组
int* a = new int[10];
for(int i = 0;i<10;i++)
a[i] = i;
for(int i = 0;i<10;i++)
cout<<a[i];
cout<<endl;
// 开辟一维数组的同时赋值
int* a2 = new int[5]{1,2,3};
for(int i = 0;i<5;i++)
cout<<a2[i];
cout<<endl;
// 开辟二维数组
// int (*a3)[5]表示数组指针
int (*a3)[5] = new int[5][5];
for(int i = 0;i<5;i++)
{
for(int j = 0;j<5;j++)
a3[i][j] = 10;
}
cout<<*(a3[4]+4)<<endl;
// 开辟二维数组的同时赋值
// int (*a4)[5]表示数组指针
int (*a4)[5] = new int[5][5]{{1,2,3,4,5},{6,7,8,9,10}};
cout<<a4[1][2]<<endl;
}
delete
delete释放的是开辟的内存中的变量,开辟的内存实际没有被释放。
#include <iostream>
using namespace std;
int main()
{
int *a = new int(5);
delete a;
// a所指向的地址依旧存在,没有被释放
cout<<a<<endl;
// a所指向的地址中的值被释放,此时*a是一个垃圾数
cout<<*a<<endl;
*a = 100;
cout<<*a<<endl;
}