有句名言,存在即是合理的。
今天说说动态内存。我们知道我要处理任何数据,都要将数据放进内存中,然后处理。先前声明的变量就是用来分配内存给数据的。但是,对于一些计算,开始并不知道要多大的内存,运行的时候才知道,这该怎么办?这就要动态内存帮忙了。
1. 操作符 new 和new[]
如何在运行时获得内存呢?用new就可以了。如果你需要的内存大于一个元素,那就用new[]。它们将返回一个指针,这个指针指向内存模块的开始处。例如:
int * bobby;
bobby = new int [5];
这样获取第一个元素即可以用bobby[0]也可以用*bobby。第二个元素可以用bobby[1]或(*bobby+1),以此类推。
常规数组和动态数组的最大区别就是,常规数组的大小是死的,是个常量,动态数组是可以改变的。也就为数据处理带来了很多的灵活性。因为有时候你还真不知道你能得到多大的数组。
但是内存毕竟是有限的,如何判断时候还有内存给数组呢?
两种方法
a, bad_alloc
这个是操作符new默认的方法。当你内存分配失败的时候,将会有bad_alloc类型的异常被抛出来。程序停止运行。
b. nothrow
这个不会出现异常当内存分配失败,也不会终止程序,只会返回一个null指针。然后程序继续进行。声明像这样:
bobby = new (nothrow) int [5];
2. 操作符delete和delete[]
既然能分配内存,也应该要收回内存。内存资源宝贵,用完了,也要给别人用嘛(程序)。delete 可以回收单个元素的内存,delete[]回收数组的内存。
delete pointer;
delete[] pointer;
这里说明,传递给delete必须是指针或者是null指针。
给个例子
- #include <iostream>
-
#include <new>
-
using namespace std;
-
-
int main () {
-
-
int i,n;
-
int *p;
-
cout<<"How many numbers would you like to type?";
-
cin>>i;
-
p = new (nothrow) int[i];
-
if (p == 0)
-
cout<<"Error: memory could not be allcoated";
-
else {
-
for(n=0;n<i;++n) {
-
cout<<"Enter number: ";
-
cin >> p[n];
-
}
-
cout<<"You have entered: ";
-
for (n=0;n<i;++n)
-
cout<<p[n]<<", ";
-
delete[] p; //释放内存
-
}
-
return 0;
-
}
最后想说,内存管理很重要。
下次见
阅读(1213) | 评论(0) | 转发(0) |