【effective c++】定制new和delete

operator new 和 operator delete只适合用来分配单一对象。array所用的内存由operator new[]分配出来,并由operator delete[] 释放。

1、了解new-handler的行为

当operator new无法满足某一内存分配需求时,它会先调用指定的错误处理函数(new-handler),然后抛出异常。可通过set_new_handler函数来设置new-handler。

namespace std {
typedef void (*new_handler)();
new_handler set_new_handler(new_handler p) throw();
}

为当前class提供专属new-handler,只需为它提供自己的set_new_handler和operator new即可。

class Widget {
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;
};

std::new_handler Widget::currentHandler = 0;

// 注意此处要返回之前使用的new_handler
std::new_handler Widget::set_new_handler(std::new_handler p) throw() {
    std::new_handler oldHandler = currentHandler;
    currentHandler = p;
    return oldHandler;
}

void* Widget::operator new(std::size_t size) throw(std::bad_alloc) {
    NewHandlerHolder h(std::set_new_handler(currentHandler));
    return ::operator new(size);
}

// 为确保原本的new-handler能够被重新安装回去, 运用资源管理对象
class NewHandlerHolder {
public:
    explicit NewHandlerHolder(std::new_handler nh): handler(nh){}
    ~NewHandlerHolder(){
        std::set_new_handler(handler);
    }
private:
    std::new_handler handler;
    // 防止copy
    NewHandlerHolder(const NewHandlerHolder&);
    NewHandlerHolder& operator=(const NewHandlerHolder&);
};


模板化:设定class专属的new-handler的类

时间: 2024-10-11 07:11:40

【effective c++】定制new和delete的相关文章

[Effective C++]定制new和delete

本篇的两个主角是分配例程和归还例程(allocation and deallocation routines,也就是operator new和operator delete),配角是new_handler,这是当operator new无法满足客户的内存需求时所调用的函数. STL容器所使用的heap内存是由容器所拥有的分配器对象(allocator objects)管理,不是被new和delete直接管理. 条款49:了解new-handler的行为(Understand the behavi

定制new和delete更改内存管理方案

C++允许手工管理内存.依据使用内存的行为特征,然后修改分配和归还工作,以求获得其所建置的系统的最佳效率(包括时间和空间).这给了程序员通过定制operatornew和operatordelete的方式来更改new与delete表达式从而更改内存管理方案的自由.但是享受这种自由的时候必须遵守一定的规范,具体可以参见<EffectiveC++ 2nd>的相关条款.本文在此基础上补充解释一些特别容易引起误解的问题. operator new和operator delete只适合用来分配单一对象.A

定制new和delete

定制new 和delete 49.了解new-handle 的行为 set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用. Nothrow new 是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常 50. 了解new和delete的合理替换时机 有许多理由需要写个自定的new和delete, 包括改善效能,对heap运用错误进行调试,收集heap使用信息. 51. 编写new和delete时需固守常规 operator new 应该内

定制new 和 delete

1.了解new-handler的行为 当operator new 抛出异常以反映一个未满足的内存需求之前,他会先调用一个客户指定的错误处理函数,一个所谓的new-handler.为了指定这个“用以处理内存不足”的函数,客户必须调用set_new_handler,那个声明于<new>的一个标准程序库函数: namespace std{ typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw()

More Effective C++----(8)理解各种不同含义的new和delete

Item M8:理解各种不同含义的new和delete 人们有时好像喜欢故意使C++语言的术语难以理解.比如说new操作符(new operator)和new操作(operator new)的区别. new操作符和new操作的相关知识请参考<http://blog.csdn.net/qianqin_2014/article/details/51320775> 当你写这样的代码: string *ps = new string("Memory Management"); 你使

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

《Effective C++》 阅读小结(笔记)

A person who is virtuous is also courteous. "有德者必知礼" 书本介绍:<Effective C++:改善程序与设计的55个具体做法>(中文版)(第3版) 一.让自己习惯C++ 1.如今的C++是一个多重范型的编程语言,同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming): 2.因为或许 

C++ delete 和 delete []

简单结论: new delete new [] delete [] 文章 : 对 delete [] 的声明 void operator delete[] (void* ptr) throw (); void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) throw(); void operator delete[] (void* ptr, void* voidptr2) throw(); 对new 的

More Effective C++

条款一:指针与引用的区别 指针与引用看上去完全不同(指针用操作符'*'和'->',引用使用操作符'.'),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量.相反,如果变量肯定指向一个对象,例如你的设计不允许变量为