当前位置:天才代写 > tutorial > C语言/C++ 教程 > 高质量C++/C编程指南-第7章-内存打点(5)

高质量C++/C编程指南-第7章-内存打点(5)

2017-11-07 08:00 星期二 所属: C语言/C++ 教程 浏览:910

7.9 内存耗尽怎么办?
假如在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。凡是有三种方法处理惩罚“内存耗尽”问题。

(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沟通的异常处理惩罚函数。具体内容请参考C++利用手册。

上述(1)(2)方法利用最普遍。假如一个函数内有多处需要申请动态内存,那么方法(1)就显得力有未逮(释放内存很贫苦),应该用方法(2)来处理惩罚。

许多人不忍心用exit(1),问:“不编写堕落处理惩罚措施,让操纵系统本身办理行不可?”

不可。假如产生“内存耗尽”这样的工作,一般说来应用措施已经无药可救。假如不消exit(1) 把坏措施杀死,它大概会害死操纵系统。原理如同:假如不把歹徒击毙,歹徒在老死之前会犯下更多的罪。

有一个很重要的现象要汇报各人。对付32位以上的应用措施而言,无论奈何利用malloc与new,险些不行能导致“内存耗尽”。我在Windows 98下用Visual C++编写了测试措施,见示例7-9。这个措施会无休止地运行下去,基础不会终止。因为32位操纵系统支持“虚存”,内存用完了,自动用硬盘空间顶替。我只听到硬盘嘎吱嘎吱地响,Window 98已经累得对键盘、鼠标毫无回响。

我可以得出这么一个结论:对付32位以上的应用措施,“内存耗尽”错误处理惩罚措施毫无用处。这下可把Unix和Windows措施员们乐坏了:横竖错误处理惩罚措施不起浸染,我就不写了,省了许多贫苦。

我不想误导读者,必需强调:不加错误处理惩罚将导致措施的质量很差,千万不行因小失大。

void main(void)

{

float *p = NULL;

while(TRUE)

{

p = new float[1000000];

cout << “eat memory” << endl;

if(p==NULL)

exit(1);

}

}

示例7-9试图耗尽操纵系统的内存

 

    关键字:

天才代写-代写联系方式