AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 条款51:编写 new 和 delete 时需固守常规 Adhere to convention when writing new and delete. `operator new` 的返回值十分单纯,如果它有能力供应客户申请的内存,就返回一个指针指向那块内存;如果没有能力,就调用 new-handler 函数,直至成功或是抛出 bad\_alloc 异常。 ```cpp void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; if (size == 0) { size = 1; } while (true) { 尝试分配 size_t bytes; if(分配成功) return 一个指针,指向那块内存; new_handler globalHandler = set_new_handler(0); set_new_handler(globalHandler); if (globalHandlder) (*globalHandler)(); else throw std::bad_alloc(); } } ``` `operator new` 成员函数会被 derived class 继承,这会导致有可能 base class 的 `operator new` 被调用以分配 derived class 对象,为了避免这种情况,base class 专属的 `operator new` 需要判断大小: ```cpp void* Base::operator new(std::size_t size) throw(std::bad_alloc) { if (size != sizeof(Base)) return ::operator new(size); // 使用标准 new 函数处理; ... } ``` 对于 `operator new[]` ,唯一要做的事情就是分配一块未加工内存(raw memory),因为你无法对 array 之内迄今为止尚未存在的元素对象做任何事情。 `operator delete` 只需记住的事情是保证“删除null指针永远正确“。