查看单个帖子
旧 2007-01-24, 10:47 PM   #1
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 如果您要使用 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;
}
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)