(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
通常有三种方式处理“内存耗尽”问题:
(1)判断指针是否为NULL,如果是则马上用return 语句终止本函数。例如:
void Func(void)
{
A *a = new A;
if(a == NULL)
{
return;
}
…
}
(2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。例如:
void Func(void)
{
A *a = new A;
if(a == NULL)
{
cout << “Memory Exhausted” << endl;
exit(1);
}
…
}
(3)为new 和malloc 设置异常处理函数。例如Visual C++可以用_set_new_hander 函数为 new 设置用户自己定义的异常处理函数,也可以让malloc 享用与new 相同的异常处理函数。
上述(1)(2)方式使用最普遍。如果一个函数内有多处需要申请动态内存,那么方式(1)就显得力不从心(释放内存很麻烦),应该用方式(2)来处理。
malloc()函数:
int *p = (int *) malloc(sizeof(int) * length);
1.malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。
2.malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数
void free( void * memblock );
指针p 的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL指
针,那么free 对p连续操作两次就会导致程序运行错误。
int *p2 = new int[length];
这是因为new 内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么
new 的语句也可以有多种形式。