现在的位置: 首页 > 综合 > 正文

C++ 动态内存分配

2014年02月10日 ⁄ 综合 ⁄ 共 1163字 ⁄ 字号 评论关闭

通常,我们在声明一个数组时,数组的元素个数是确定的,即是一个常数。在编译的时候,编译器会根据数组的大小分配好内存。

如果我们需要在运行时决定数组的大小,比如接受用户的输入。此时,如果你试图用变量来代替常量,编译器则不允许通过。

在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...

抱歉!评论已关闭.