[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 behavior of the new-handler.)

请记住:

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

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

条款50:了解new和delete的合理替换时机(Understand when it makes sense to repace new and delete.)

请记住:有很多理由需要写个自定的new和delete,包括改善效能、对heap运用错误进行调试、收集heap使用信息。

条款51:编写new和delete时需固守常规(Adhere to convention when writing new and delete.)

请记住:

1)operator new应该包含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler。它也应该有能力处理0 bytes申请。Class专属版本则还应该处理“比正确大小更大的(错误)申请”。

2)operater delete应该在收到null指针时不做任何事。Class专属版本则还应该处理“比正确大小更大的(错误)申请”。

条款52:写了placement new也要写placement delete(Write placement delete if you write placement new.)

请记住:

1)当你写一个placement operator new,请确定也写出了对应的placement operator delete。如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄露。

2)当你声明placement new和placement delete,请确定不要无意识地遮掩了它们的正常版本。

时间: 2024-10-07 04:49:29

[Effective C++]定制new和delete的相关文章

定制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 应该内

【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_ha

定制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++

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