如果operator new接收到的参数除了size_t之外还有其他的话,那么这个operator new实际上就是一个placement new,所以考虑下下面这样的情况: 一个可以用来记录信息的placement new: class Widget{ public: ... static void * operator new(std::size_t size, std::ostream & logStream = std::cout) throw(std::bad_alloc); stat…
当你写一个placement operator new ,请确定也写出了对应的placement operator delete.如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄漏. 当你声明placement new 和 placement delete,请确定不要(非故意)地遮掩了它们的正常版本.…
NOTE: 1.当你写一个placement operator new .请确定也要写出了对应的placement operator delete.如果没有这样做,你的程序可能发生隐晦而时断时续的内存泄漏. 2.当你声明placement new 和placement delete,请确定不要无意识(非故意)地遮掩了它们的正常版本.…
"placement new"通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存. 但广义的"placement new"指的是拥有额外参数的operator new. new和delete是要成对的,因为当构造函数抛出异常时用户无法得到对象指针,因而delete的责任在于C++运行时. 运行时需要找到匹配的delete并进行调用.因此当我们编写了"placement…
1.Widget* pw = new Widget; 调用了两个方法:第一个方法是operator new 负责分配内存:第二个方法是在分配的内存上构造Widget,即调用Widget的default构造方法. 2.那么问题来了,如果operator new分配内存成功,而Widget构造抛出异常,这种情况下,pw还没有赋值,这不就导致资源泄露了? 不会造成资源泄露,因为C++运行系统保证调用delete释放资源. 3.正常的operator new 如下: void* operator new…
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存分配:后继的构造函数调用还是可能抛出异常 ----------------------------------------------------------------------------------- new操作符私底下通过调用operator new来实现内存分配.当operator ne…
看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言联邦. 2. 尽量以const, enum ,inline 替换#define a)  对于单纯常量,最好以const 对象或 enum 替换 #define b)  对于形似函数的宏,最好改用inline 函数替换 #define 3. 尽可能使用const a)  将某些东西声明为const可帮…
学习c++的童鞋们,这本书不能错过,最近在学校图书馆借来这本书,准备好好啃啃它了,先把它的基本内容过一遍吧. 改变旧有的的C习惯 条款1:尽量以const和inline取代#define. 条款2:尽量以<iostream>取代<stdio.h> 条款3:尽量以new和delete取代malloc和free. 条款4:尽量使用C++风格的注释形式. 条款5:使用相同形式的new和delete. 内存管理篇 条款6:记得在destructor中以delete对付pointer  me…
条款1:视C++为一个语言联邦:C.Object-Oriented C++.Template C++.STLC++高效编程守则视情况而变化,取决于使用C++的哪一个部分 条款2:尽量以const,enum,inline替换#define1.对于单纯的常量,最好以const对象或enums替代#define2.对于形似函数的宏,最好用inline函数替代#define 条款3:尽可能使用const3.尽量使用const,将某些东西声明为const可以帮助编译器侦测出错误的用法.const可被施加与…
STL容器所使用的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理.本章并不讨论STL分配器. 条款49 : 了解new-handler的行为 当operator new 抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler.可以调用一个声明于<new>的一个标准程序库函数set_new_handler来指定这个函数,set_new_handler的参数是个指针,指向operator new 无法分配足够…