Effective C++ --8 定制new和delete && 9杂谈讨论

来源:互联网 发布:mt管理器源码 编辑:程序博客网 时间:2024/05/15 03:53

上一篇Effective C++ --7 模板与泛型编程

 

Effective C++ --8定制newdelete

49、了解new-handler的行为

 1set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被满足。Operate new确保在分配class对象内存的过程中以class专属之new_handler替换global new-handler

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

50、了解newdelete的合理替换时机

 1)替换编译器所提供的operator newoperator delete的理由:用来检测运用上的错误、为了强化效能、为了收集使用上的统计数据。

51、编写newdelete时需固守常规

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

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

52、写了placement new也要写placement delete

 1placement new是指非正常形式附带参数的operator newoperator new接受的参数除了一定会有的那个size_t之外还有别的参数。正常的operator new函数为 void* operator new(std::size_t)throw(std::bad_alloc);

 2)当写了一个placement operator new时,要确定也写出了对应的placement delete。如果没有那么做,程序可能会发生隐微而时断时续的内存泄露。如果没有声明对应的placement operator delete,运行期系统不知道如何取消并恢复原先对placement new的调用,这样就会造成内存泄露。Placement delete只有在伴随placement new调用而触发的构造函数出现异常时才会被调用,平时不会调用。

 3)当声明placement newplacement delete时,确定不要无意识地遮掩了正常版本。如果在class内声明任何operator new,就会遮掩所有operator newplacement newnothrow new

Effective C++ --9杂谈讨论

53、不要轻忽编译器的警告

 1)严肃对待编译器发出的警告信息。努力在编译器最高警告级别下争取“无任何警告”的荣誉。

 2)不要过度依赖编译器的报警能力,因为不同的编译器对待事物的态度并不相同。一旦移植到另一个编译器上,原本依赖的警告信息有可能消失。

54、让自己熟悉包括TR1在内的标准程序库

 1C++标准程序库的主要机能由STLiostreamslocalesmultiple active locales,多区域)组成。并包含C99标准库。

 2TR1添加了智能指针(tr1::shared_ptr)、一般化函数指针(tr1::function)、hash-based容器、正则表达式(regular expression)以及另外10个组件的支持。

 3TR1自身只是一份规范,为获得TR1提供的好处,需要一份实物。一个好的实物来源是Boost

55、让自己熟悉Boost

1Boost在标准化过程中扮演深具影响力的角色,提供许多TR1组件实现品,以及许多程序库。

0 0
原创粉丝点击