c++中new的几种用法
(2013-04-10 21:30:45)
标签:
new运算符函数的用法 |
2.
一维: int *a = new
int[100];开辟一个大小为100的整型数组空间
二维: int *a = new
int[5][6]
三维及其以上:依此类推.
一般用法: new 类型 [初值]
delete用法:
1. int *a = new
int;
2.int *a = new
int[5];
要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它. 在释放时有区别。你用new申请的堆内存,你有释放它的义务和责任,你必须用delete释放它,否则会造成内存泄漏,即memory leak, 对于一个对象而言,释放它的方式取决于你的构造函数,是否用到new申请内存。但是例2的指针是一定要用delete释放的。 c++中,new的用法很灵活,这里进行了简单的总结:
1. new() 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量;
2. new[]
分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量;
#include
int main()
{
//error分配一个char(1字节)的空间,
char* p=new char[6];
//p="Hello";
//不能将字符串直接赋值给该字符指针p,原因是:
//指针p指向的是字符串的第一个字符,只能用下面的
//strcpy
//只是输出p指向的字符串的第一个字符!
//输出p指向的字符串!
delete[] p;
输出结果: H Hello
3. 当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,返回的类型保持了除最左边维数外的所有维数。
例如:
#include
using namespace std;
{
int (*c)[2] = new int[34][2];
int (*e)[2][3] = new int[34][2][3];
int (*f)[2][3] = new int[][2][3];
a[0] = 1;
b[0] = 1; //运行时错误,无分配的内存,b只起指针的作用,用来指向相应的数据
e[0][0][0] = 1;
cout<<typeid(b).name()<<endl;
cout<<typeid(c).name()<<endl;
cout<<typeid(d).name()<<endl;
cout<<typeid(e).name()<<endl;
cout<<typeid(f).name()<<endl;
delete[] a;
delete[] c;
delete[] d;
delete[] e;
delete[] f;
}
输出结果: int * int * int (*)[2] int (*)[2] int (*)[2][3]
int (*)[2][3] 虽然有三种new的用法,但是分为两大类也未尝不可,那么是哪两类呢?其一是new
operator,也叫new表达式;其二是operator
new,也叫new操作符。这两个英文名称起的也太绝了,很容易搞混,那就记中文名称吧。new表达式比较常见,也最常用,例如:
string* ps = new string("abc"); 上面这个new表达式完成了两件事情:申请内存和初始化对象。
new操作符类似于C语言中的malloc,只是负责申请内存,例如: void* buffer = operator
new(sizeof(string)); 注意这里多了一个operator。这是new的第二个用法,也算比较常见吧。
那么第三个用法就不很常见了,官方的说法是placement
new,它用于在给定的内存中初始化对象,也就是说你手中已有一块闲置的内存,