Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 重读《Effective c++》——摘要1
【标  题】:重读《Effective c++》——摘要1
【关键字】:Effective,c++
【来  源】:http://blog.chinaunix.net/article.php?articleId=52077&blogId=9646

重读《Effective c++》——摘要1

Your Ad Here

c++标准 operator new    自定义错误处理函数

        c++中缺省的operator newoperator delete具有非常好的通用性,它的这种灵活性也使得在某些特定

的场合下,可以进一步改善它的性能。尤其在那些需要动态分配大量的但很小的对象的应用程序里,

情况更是如此。

    自己重写operator new时很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做

起来也就是:要有正确的返回值;可用内存不够时要调用出错处理函数;处理好0字节内存请求的情况等。

        c++标准operator new 的伪代码如下:

 

 

void * operator new(size_t size)        // operator new还可能有其它参数
{                                      

if (size == 0)

{                      // 处理0字节请求时,
    size = 1;                           //
把它当作1个字节请求来处理

}                                    

while (1)

{
   
分配size字节内存;

if (分配成功)
      return (
指向内存的指针);

// 分配不成功,找出当前出错处理函数
    new_handler globalhandler = set_new_handler(0);
    set_new_handler(globalhandler);

if (globalhandler) (*globalhandler)();
    else throw std::bad_alloc();
 }

}

 

 

  上面的代码清楚地说明了这一点——while (1)将导致无限循环。

  要跳出循环的办法是错误处理函数即new_handler必须满足下列条件之一:

 

  1.产生更多的可用内存。这将使operator new下一次分配内存的尝试有可能获得成功。

     实施这一策略的一个方法是:在程序启动时分配一个大的内存块,然后在第一次调用new-handler时释放。

  2. 安装另一个不同的new-handler函数。如果当前的new-handler函数不能产生更多的可用内存,

     可能它会知道另一个new-handler函数可以提供更多的资源。这样的话,当前的new-handler可以安装另一个

     new-handler来取代它    

          (通过调用set_new_handler)。下一次operator new调用new-handler时,会使用最近安装的那个。

    3. 卸除new-handler。也就是传递空指针给set_new_handler

     没有安装new-handleroperator new分配内存不成功时就会抛出一个标准的std::bad_alloc类型的异常。

  4.抛出std::bad_alloc或从std::bad_alloc继承的其他类型的异常。这样的异常不会被operator new捕捉,

     所以它们会被送到最初进行内存请求的地方。(抛出别的不同类型的异常会违反operator new异常规范。

     规范中的缺省行为是调用abort,所以new-handler要抛出一个异常时,一定要确信它是从std::bad_alloc继承来的)

    5.没有返回。典型做法是调用abortexit

 



dll模板:【上一篇】
在C语言里使用shell脚本:【下一篇】
【相关文章】
  • 重读《Effective c++》——摘要2
  • C++之个人财务管理
  • C/C++基础知识一(变量声明与赋值)
  • C++的缺陷(1)——Stream的缺陷
  • 我现在理解的C++(转载)
  • c++ 软件 工具
  • C++ 的学习
  • 一个跨平台的 C++ 内存泄漏检测器
  • C/C++数组名与指针区别深入探索
  • C与C++的一些不同点
  • 【随机文章】
  • Linux常用端口对照
  • 减少Flash MX 2004的启动时间
  • 循环实现Fabonacci问题
  • 压缩、解压缩类
  • 发现了一个不错的js类库
  • C++BUILDER的文件操作
  • 为什么应用程序池总是崩溃(Crash)
  • JavaScript部分函数
  • 硬盘安装fc5、suse10.1的菜鸟心得......
  • 几张不错的VS2005桌面
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.