通常,我们在声明一个数组时,数组的元素个数是确定的,即是一个常数。在编译的时候,编译器会根据数组的大小分配好内存。
如果我们需要在运行时决定数组的大小,比如接受用户的输入。此时,如果你试图用变量来代替常量,编译器则不允许通过。
在C++中,提供了两个专有的操作符,new delete
new基本格式是:
new data_type;
new data_type[array_element_size];
new后面跟一个数据类型,比如int,double等。如果只请求一组元素,则需添加一个中括号,中括号里存储数组的大小,可以是常量,也可以是变量。
new操作符返回的是一个相应类型的指针。如果请求的是一个元素,则该指针指向该元素的第一个字节。如果是数组,则指向该数组的第一个元素的第一个字节。
如果数组的大小太大,比如用户申请10亿个数组,则分配失败,会抛出异常。为了简单起见,我们可以在 new后加一个参数nothrow,如果内存分配失败,则返回一个null的指针。
对于动态分配的数组访问,可以有两种方法,如果我们想访问第1个元素,pointer[0] or *(pointer+0)
new的一个简单例子:
int main()
{
int i;
int * pointer;
cout<<"请输入一个数字"<<endl;
cin>>i;
pointer = new(nothrow) int[i];
if(pointer == 0)
{
cout<<"动态内存分配失败"<<endl;
}
else
{
cout<<"内存分配成功"<<endl;
}
}
该例子中声明了一个变量i,用来存储用户输入的数字。然后通过new操作符动态申请内存,如果申请成功,将该数组的第一个元素的指针返回给pointer。否则返回null。
动态分配的内存存储在内存堆中(heap),因为我们知道内存是有限的,因此处理完之后应该释放空间,这里需要用到另一个操作符 delete。
delete基本格式:
delete pointer;
delete[] pointer;
第一种格式是释放一个元素空间,第二种格式是释放一个数组空间。
所以上面的例子存在漏洞,修改之后:
int main()
{
int i;
int * pointer;
cout<<"请输入一个数字"<<endl;
cin>>i;
pointer = new(nothrow) int[i];
if(pointer == 0)
{
cout<<"动态内存分配失败"<<endl;
}
else
{
cout<<"内存分配成功"<<endl;
}
delete[] pointer;
}
注意new 和delete操作符是C++专有的,C语言不含有该操作符,但是有其它操作动态内存分配的函数,比如malloc,realloc,calloc和free。C++如果包含<cstdlib>也可以使用该函数。
Over...