目录
定义
new其实就是计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是,new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int *p=new int;
*p=5;
cout<<*p;
return 0;
}
输出结果
5
new使用方法
new创建对象
当只使用new时,new分配这种类型的一个大小的内存空间,需要没有初始化,需要手动初始化。
代码样例
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int *str=new int;
*str=10;
cout<<*str;
return 0;
}
输出结果
10
new()的意义
new( ) 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量;
代码样例
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int *str=new int(3);//将一个int类型的地址赋值给指针
cout<<*str;
return 0;
}
输出结果
3
new开辟一维数组空间
new[ ] 分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量;
代码样例
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int *str=new int[10];//将一个含有10个整数的地址赋值给str
for(int i=0;i<10;i++){
cin>>str[i];
cout<<str[i]<<" ";
}
return 0;
}
输出样例
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
new开辟二维数组空间
当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,
返回的类型保持了除最左边维数外的所有维数。例如:
int *p1 = new int[10];
返回的是一个指向int的指针int*
int (*p2)[10] = new int[2][10];
new了一个二维数组, 去掉最左边那一维[2], 剩下int[10], 所以返回的是一个指向int[10]这种一维数组的指针int (*)[10].
int (*p3)[2][10] = new int[5][2][10]; new了一个三维数组, 去掉最左边那一维[5], 还有int[2][10], 所以返回的是一个指向二维数组int[2][10]这种类型的指针int (*)[2][10].
总结
new创建对象需要指针接收,一处初始化,多处使用
new创建对象使用完需delete销毁
new创建对象直接使用堆空间,而局部不用new定义对象则使用栈空间
new对象指针用途广泛,比如作为函数返回值、函数参数等
频繁调用场合并不适合new,就像new申请和释放内存一样
释放new分配的空间时用delete进行删除。