《Effective C++》笔记(一)

简介:
 
Item 1:  Prefer const and inline to #define.

Item 2:  Prefer <iostream> to <stdio.h>.

Item 3:   Prefer new and delete to malloc and free.

Item 4:   Prefer C++-style comments.

Item 5:  Use the same form in corresponding uses of new and delete.

Item 6:  Use delete on pointer members in destructors.

Item 7:  Be prepared for out-of-memory conditions.


   当内存分配请求不能满足时,调用你预先指定的一个出错处理函数。这个方法基于一个常规,即当operator new不能满足请求时,会在抛出异常之前调用客户指定的一个出错处理函数——一般称为new-handler函数
指定出错处理函数时要用到set_new_handler函数,它在头文件<new>里大致是象下面这样定义的:

 typedef void (*new_handler)();
new_handler set_new_handler(new_handler p) throw();

可以看到,new_handler是一个自定义的函数指针类型,它指向一个没有输入参数也没有返回值的函数。set_new_handler则是一个输入并返回new_handler类型的函数。

set_new_handler的输入参数是operator new分配内存失败时要调用的出错处理函数的指针,返回值是set_new_handler没调用之前就已经在起作用的旧的出错处理函数的指针。

可以象下面这样使用set_new_handler: 

void nomorememory()
{
    cerr << "unable to satisfy request for memory\n";
    abort();
}

int main()
{
    set_new_handler(nomorememory);
    int *pbigdataarray = new int[100000000];    
}

operator new不能满足内存分配请求时,new-handler函数不只调用一次,而是不断重复,直至找到足够的内存
一个设计得好的new-handler函数必须实现下面功能中的一种。
    产生更多的可用内存。这将使operator new下一次分配内存的尝试有可能获得成功。实施这一策略的一个方法是:在程序启动时分配一个大的内存块,然后在第一次调用new-handler时释放。释放时伴随着一些对用户的警告信息,如内存数量太少,下次请求可能会失败,除非又有更多的可用空间。
    安装另一个不同的new-handler函数。如果当前的new-handler函数不能产生更多的可用内存,可能它会知道另一个new-handler函数可以提供更多的资源。这样的话,当前的new-handler可以安装另一个new-handler来取代它(通过调用set_new_handler)。下一次operator new调用new-handler时,会使用最近安装的那个。(这一策略的另一个变通办法是让new-handler可以改变它自己的运行行为,那么下次调用时,它将做不同的事。方法是使new-handler可以修改那些影响它自身行为的静态或全局数据。)
    卸除new-handler。也就是传递空指针给set_new_handler。没有安装new-handler,operator new分配内存不成功时就会抛出一个标准的std::bad_alloc类型的异常。
    抛出std::bad_alloc或从std::bad_alloc继承的其他类型的异常。这样的异常不会被operator new捕捉,所以它们会被送到最初进行内存请求的地方。(抛出别的不同类型的异常会违反operator new异常规范。规范中的缺省行为是调用abort,所以new-handler要抛出一个异常时,一定要确信它是从std::bad_alloc继承来的。)
    没有返回。典型做法是调用abort或exit。
 
c++不支持专门针对于类的new-handler函数,而且也不需要。你可以自己来实现它,只要在每个类中提供自己版本的set_new_handler和operator new。类的set_new_handler可以为类指定new-handler(就象标准的set_new_handler指定全局new-handler一样)。类的operator new则保证为类的对象分配内存时用类的new-handler取代全局new-handler。
template<class t>    // 提供类set_new_handler支持的
class newhandlersupport {    // 混合风格”的基类
public:
    static new_handler set_new_handler(new_handler p);
    static void * operator new(size_t size);
private:
    static new_handler currenthandler;
};

template<class t>
new_handler newhandlersupport<t>::set_new_handler(new_handler p)
{
    new_handler oldhandler = currenthandler;
    currenthandler = p;
    return oldhandler;
}

template<class t>
void * newhandlersupport<t>::operator new(size_t size)
{
    new_handler globalhandler =
        std::set_new_handler(currenthandler);
    void *memory;
    try {
        memory = ::operator new(size);
    }
    catch (std::bad_alloc&) {
        std::set_new_handler(globalhandler);
        throw;
    }
    std::set_new_handler(globalhandler);
    return memory;
}

template<class t>
new_handler newhandlersupport<t>::currenthandler;

有了这个模板类,对类x加上set_new_handler功能就很简单了:只要让x从newhandlersupport<x>继承:
class x: public newhandlersupport<x> 
{

};        


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/07/16/820049.html,如需转载请自行联系原作者
目录
相关文章
|
29天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
34 0
|
3月前
|
设计模式 安全 编译器
Effective C++55 笔记
Effective C++55 笔记
21 0
|
6月前
|
消息中间件 存储 前端开发
[笔记]C++并发编程实战 《四》同步并发操作(三)
[笔记]C++并发编程实战 《四》同步并发操作(三)
|
2月前
|
算法 安全 C++
C++ Effective Modern Pointer (智能指针模块)
C++ Effective Modern Pointer (智能指针模块)
|
2月前
|
机器学习/深度学习 算法 编译器
【C++】自学终极笔记
【C++】自学终极笔记
150 0
|
3月前
|
存储 算法 C++
《C++ STL开发技术引导》 第五章-C++ STL泛化技术分析笔记
《C++ STL开发技术引导》 第五章-C++ STL泛化技术分析笔记
|
3月前
C++2.0(C++11) 笔记 二
C++2.0(C++11) 笔记 二
20 0
|
3月前
|
编译器 容器
C++11 (C++2.0)笔记 一
C++11 (C++2.0)笔记 一
33 0
|
4月前
|
C语言 C++ iOS开发
嵌入式c++软件开发笔记 第六讲
嵌入式c++软件开发笔记 第六讲
16 0
|
4月前
|
算法 编译器 C++
嵌入式c++软件开发笔记第五讲
嵌入式c++软件开发笔记第五讲
17 0