几何尺寸与公差论坛

 找回密码
 注册
查看: 3921|回复: 1

如果您要使用 MFC,则全局运算符 new 将在内存耗尽时引发一个异常。

[复制链接]
发表于 2007-1-24 22:47:21 | 显示全部楼层 |阅读模式
如果您要使用 MFC,则全局运算符 new 将在内存耗尽时引发一个异常。

当您使用 C++ 运算符 new 时,事情开始变得更加有趣。例如,如果您要使用 MFC,则全局运算符 new 将在内存耗尽时引发一个异常。这意味着您不能执行以下操作:

int *ptr1;
int *ptr2;
ptr1 = new int[10];
ptr2 = new int[10]; // WRONG!!!!
如果第二次内存分配引发异常,则第一次分配的内存将泄漏。如果您的代码嵌入到将要长期运行的服务或应用程序中,则这些泄漏会累积起来。

只是捕捉异常是不够的,您的异常处理代码还必须是正确的。不要掉到下面这个诱人的陷阱中:

int *ptr1;
int *ptr2;
try
{
ptr1 = new int[10];
ptr2 = new int[10];
}
catch (CMemoryException *ex)
{
delete [] ptr1; // WRONG!!!
delete [] ptr2; // WRONG!!!
}
如果第一次内存分配引发了异常,您将捕捉该异常,但要删除一个未初始化的指针。如果您足够幸运,这将导致即时访问冲突和崩溃。更有可能的是,它将导致堆损坏,从而造成数据损坏和/或在将来难以调试的崩溃。尽力初始化下列变量是值得的:

int *ptr1 = 0;
int *ptr2 = 0;
try
{
ptr1 = new int[10];
ptr2 = new int[10];
}
catch (CMemoryException *ex)
{
delete [] ptr1;
delete [] ptr2;
}
 楼主| 发表于 2007-1-24 22:50:42 | 显示全部楼层

回复: 如果您要使用 MFC,则全局运算符 new 将在内存耗尽时引发一个异常。

小结

如果您要编写可靠的代码,则至关重要的一点是从一开始就考虑如何处理异常事件。您不能事后再考虑对异常事件的处理。在考虑此类事件时,错误处理是一个关键的方面。

错误处理很难正确执行。尽管本文只是粗浅地讨论了这一问题,但其中介绍的原则奠定了一个强大的基础。请记住以下要点:

•在设计应用程序(或 API)时,应预先考虑您喜欢的错误处理范例。

•在使用 API 时,应了解它的错误处理范例。

•如果您处于存在多个错误处理范例的情况下,请警惕可能造成混乱的根源。

•总是检查返回状态。

•总是检查内存分配。



如果您执行了上述所有操作,就能够编写出可靠的应用程序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-12-31 02:32 , Processed in 0.036490 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表