设为首页 加入收藏

TOP

Effective C++ 条款 49:了解new-handler的行为(二)
2015-07-20 17:35:46 来源: 作者: 【 】 浏览:8
Tags:Effective 条款 了解 new-handler 行为
失败,则抛出异常
(六)

可以将上述方法抽象,建立mixin风格的基类,它允许派生类继承单一特定能力(这里是“设定该类专属的new-handler“),并把该基类抽象为模板类以提高复用性。
代码如下:

template
   
    
class NewHandlerSupport {
public:
	static std::new_handler set_new_handler(std::new_handler p) throw();
	static void* operator new(std::size_t size) throw(std::bad_alloc);
private:
	static std::new_handler currentHandler;
};

template
    
      std::new_handler NewHandlerHolder
     
      ::set_new_handler(std::new_handler p) throw() { std::new_handler oldHandler = currentHandler; currentHandler = p; return oldHandler; } template
      
        void* NewHandlerSupport
       
        ::operator new(std::size_t size) throw(std::bad_alloc){ NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size); }
       
      
     
    
   
因为对于class里面的static成员变量的初始化必须要在class的外面定义。

所以以下是将每一个currentHandler初始化为null

template
   
    
std::new_handler NewHandlerSupport
    
     ::currentHandler = 0;
    
   

(七)

对于一个具体的类,添加专属的set_new_handler就很容易了:继承。
class Widget : public NewHandlerSupport
   
    {
	...	//和先前一样,但不必声明set_new_handler或operator new
};
   

(八)

6.旧式的operator new在内存分配失败后返回null,为了兼容旧代码,C++提供了另
一形式的operator new,称为nothrow形式,在new使用的场合使用了nothrow对象(定义于
   
    头文件中)。建议不要使用。因为如果构造函数也抛出异常的话,那样的话会产生递归发生异常。
   

请记住:

(1)set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用。

(2)Nothrow new是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是有可能抛出异常的。








首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 3555 Bomb ( 数位DP) 下一篇HDU5045Contest(记忆化搜索)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)