几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   内存泄漏 (http://www.dimcax.com/hust/forumdisplay.php?f=118)
-   -   如果您要使用 MFC,则全局运算符 new 将在内存耗尽时引发一个异常。 (http://www.dimcax.com/hust/showthread.php?t=470)

huangyhg 2007-01-24 10:47 PM

如果您要使用 MFC,则全局运算符 new 将在内存耗尽时引发一个异常。
 
如果您要使用 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;
}

huangyhg 2007-01-24 10:50 PM

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

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

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

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

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

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

•总是检查返回状态。

•总是检查内存分配。



如果您执行了上述所有操作,就能够编写出可靠的应用程序。


所有的时间均为北京时间。 现在的时间是 04:08 PM.