条款51:编写new以及delete的时候需要固守常规

C++中delete一个指针之后,只是回收指针指向位置的空间,而指针本身的值不变。你需要手工将其赋值为NULL。注意的一点是delete NULL指针的时候不会有任何的事情发生

小结:

operator new内应该有个个无穷循环,若在其中无法返回内存需求,就调用new-handler,这里面也应该能够处理0 bytes内存申请,class的专属版本还应该能处理 “比正确大小更大的”申请。(可能有继承导致,derived class可能会使用从基类继承而来的operator new)

operator应该在收到null指针的时候不去做任何的事情,class的专属版本还应该能处理 “比正确大小更大的”申请。

时间: 2024-10-13 00:41:46

条款51:编写new以及delete的时候需要固守常规的相关文章

Effective C++ 条款51 编写new和delete时需固守常规

1. 实现定制的operator new和operator delete需要满足一定的要求. 以operator new而言:实现一致性operator new必须返回正确的值;内存不足时必得调用new-handling函数;必须有对付零内存需求的准备;需避免不慎掩盖正常形式的new;如果有能力供应客户申请的内存,就返回一个指针指向该内存,反之就遵循条款49的规则并抛出bad_alloc异常;应该内含一个无限循环,知道成功分配内存或new-handling完成其功能...... 以上的要求中"必

Effective C++ 条款50 了解new和delete的合理替换时机

1. 替换标准库提供的operator new或operator delete通常基于以下三个理由: 1). 用来检测运行上的错误.将"new 所得内存"delete掉却不幸失败会导致内存泄露,多次对同一块"new所得内存"施行delete会导致未定义行为,如果让operator new持有一串动态分配所得地址,而operator delete将地址从中移走,就可以很容易检测出上述错误;各式各样的变成错误会导致数据"overruns"(写入点在分

《Effective C++》:条款51:编写new和delete时需固守常规

条款 50已经说明为什么要写自己的operator new和operator delete,本条款解释在编写时遵循什么守则. 从operator new开始.operator new必须返回正确的值,内存不足时必须调用new-handling函数,要有对付零内存需求的准备,避免不慎掩盖正常形式的new–这比较偏近class接口的要求而非实现要求.正常形式的new描述与条款 52. operator new如果申请内存成功,就返回指向那块内存的指针,失败则遵循条款 49描述,抛出bad_alloc

Effective C++ 条款 51:编写new和delete时需固守常规

(一) 实现一致性operator new必须返回正确的值,内存不足时必须调用new_handling函数,必须有对付零内存的准备,还需要避免不慎掩盖正常形式的new. void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; if (size == 0) { size = 1; } while (true) { 尝试分配size byte if (分配成功) return (一个指针,指向

Effective C++ -----条款51:编写new 和delete 时需固守常规

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

读书笔记 effective c++ Item 51 实现new和delete的时候要遵守约定

Item 50中解释了在什么情况下你可能想实现自己版本的operator new和operator delete,但是没有解释当你实现的时候需要遵守的约定.遵守这些规则并不是很困难,但是它们其中有一些并不直观,所以知道这些规则是什么很重要. 1. 定义operator new的约定 1.1 约定列举 我们以operator new开始.实现一个一致的operator new需要有正确的返回值,在没有足够内存的时候调用new-handling函数(见Item 49),并且做好准备处理没有内存可分配

Effective C++ 的55个条款

看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言联邦. 2. 尽量以const, enum ,inline 替换#define a)  对于单纯常量,最好以const 对象或 enum 替换 #define b)  对于形似函数的宏,最好改用inline 函数替换 #define 3. 尽可能使用const a)  将某些东西声明为const可帮

Effective C++ 55条款及应该记住的事项

1. 让自己习惯C++ 01. 视C++为一个语言联邦 请记住:  C++高效编程守则视状况而变化,取决于你使用C++的哪一部分 02. 尽量以const,enum,inline,替换#define 请记住:  对于单纯变量,最好以const对象或enums替换#defines  对于形似函数的宏(macros),最好改用inline函数替换#defines 03. 尽可能使用const 请记住:  将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加于任何作用域内的

定制new和delete

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