Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103682702
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-16 18:49:05

    来源:Blog    作者:fatalerror99

当 operator new 不能满足一个内存请求时,它反复调用 new-handler function 直到它能找到足够的内存。但是从这种高层次的描述已足够推导出一个设计得好的 new-handler function 必须做到以下事情之一:

  ·Make more memory available(使得更多的内存可用)。这可能使得 operator new 中下一次内存分配的尝试成功。实现这一策略的一个方法是在程序启动时分配一大块内存,然后在 new-handler 第一次被调用时释放它供程序使用。

  ·Install a different new-handler(安装一个不同的 new-handler)。如果当前的 new-handler 不能做到使更多的内存可用,或许它知道有一个不同的 new-handler 可以做到。如果是这样,当前的 new-handler 能在它自己的位置上安装另一个 new-handler(通过调用 set_new_handler)。operator new 下一次调用 new-handler function 时,它会得到最近安装的那一个。(这个主线上的一个变化是让一个 new-handler 改变它自己的行为,这样,下一次它被调用时,可以做一些不同的事情。做到这一点的一个方法是让 new-handler 改变能影响 new-handler 行为的 static(静态),namespace-specific(名字空间专用)或 global(全局)的数据。)

  ·Deinstall the new-handler(卸载 new-handler),也就是,将空指针传给 set_new_handler。没有 new-handler 被安装,当内存分配没有成功时,operator new 抛出一个异常。

  ·Throw an exception(抛出一个异常),类型为 bad_alloc 或继承自 bad_alloc 的其它类型。这样的异常不会被 operator new 捕获,所以它们将被传播到发出内存请求的地方。

  ·Not return(不再返回),典型情况下,调用 abort 或 exit。

  这些选择使你在实现 new-handler functions 时拥有极大的弹性。

  有时你可能希望根据被分配 object 的不同,用不同的方法处理内存分配的失败:

class X {
public:
 static void outOfMemory();
 ...
};
class Y {
public:
 static void outOfMemory();
 ...
};
X* p1 = new X; // if allocation is unsuccessful,
// call X::outOfMemory

Y* p2 = new Y; // if allocation is unsuccessful,
// call Y::outOfMemory

阅读(243) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~