一、new运算符
1--
不同于C语言只能用malloc和calloc等库函数来动态分配空间,C++可以new运算符动态分配内存空间。程序员只需要告诉new为哪一种数据结构类型分配空间,new将找到一个内存块,并将返回其地址。当然,这一地址(指针)的数据结构类型是指向所分配数据结构类型的指针。
以下是为int型指针分配空间的示例:
int* p=new int;
分配内存的通用格式是:
typeName* pointer=new typeName;
2--
如果需要使用new运算符创建一个动态数组,比方说建立一个包含20个int元素的数组,可以这样做:
int* parray=new int[20];
熟悉C语言的朋友应该知道,数组名可以被隐式转化为一个指向数组第一个元素的指针。new int[20]表达式返回一个指向int的指针,也就是int*类型变量。所以上述这个式子就非常合理了。
二、delete运算符
1--
C语言用free()函数释放内存,而C++中可以使用delete运算符释放内存。示例如下:
int* p=new int;
cin>>p;
cout<<p;
delete p;
delete p;将释放p指向的内存,但不会删除p指针本身。而是找到p所指的地址,并释放。
2--
对于new创建的动态数组,用如下的表达式释放
delete [] parray;
3--
和malloc作用的效果一样,得到的指针p虽然被分配了空间,但仍然是一个指针,仍然可以进行指针运算,如下:
#include <iostream>
using namespace std;
int main(void)
{
int* p;
p=new int[20];
p[0]=0;
p[1]=1;
p++;
cout<<*p;
}
输出结果是1,说明成功进行了指针运算。
三、new运算符和初始化
new运算符如果只有和malloc和calloc一样的功能,那就太乏善可陈了!
事实上,new运算符支持对单个变量、数组初始化操作,具体而言如下
1--对单个变量初始化
做法是在后面加上一对圆括号(),圆括号中是需要初始化的值,示例如下:
#include <iostream>
int main(void)
{
int* a=new int(3);
std::cout<<(*a);
}
//输出结果为3
2--对数组进行初始化
做法是后面加上一对花括号{},花括号中是用逗号(,)分割的初始化的值。用花括号是符合C语言习惯的,C语言对数组进行初始化,用的也是{}。具体示例如下:
#include <iostream>
int main(void)
{
int* a=new int[5]{1,2,3,4,5};
std::cout<<(a[4]);
}
//输出结果为5
有趣的是,在C++11标准中,使用{}的初始化也适用于单个变量:
#include <iostream>
int main(void)
{
int* a=new int{3};
std::cout<<*a;
}
//输出结果为3