【Effective C++】定制new和delete
条款49:了解new-handle的行为
- new-handle客户指定的内存分配错误函数
- set_new_handle函数用来设置new_handle函数
1 namespace std { 2 typedef void(*new_handle)(); 3 new_handle set_new_handler(new_handle p) throw(); 4 }
条款50:了解new和delete的合理提换时机
- 检测内存错误
- 强化效能
- 收集内存分配使用的数据
- 等等
条款51:编写new和delete时需固守常规
- 自定义的new应该内含一个无穷循环,在其中尝试分配内存,如果失败,就该调用new-handler以退出循环。同时它应该有能力处理0 bytes的申请(可以简单判断并改为1bytes)。Class专属版本还要处理衍生类的申请,不要直接调用基类的(大小不同),可以判断并转调普通的new函数。
- 自定义的delete应该可在收到null指针时不做任何事,Class专属版本还应该处理衍生类的申请,不要直接调用基类的(大小不同),可以判断并转调普通的delete函数。
条款52:写了placement new也要写placement delete
- 关于placement new和placement delete参见《More Effective C++》 条款八:operator new和new operator
- 当创建对象时,会先进行new,然后调用构造函数,如果构造出现异常,就需要delete,否则内存泄漏。如果用了placement new,那么编译器会寻找含有同样参数的placement delete,否则不会delete,因此必须成对写接收同样参数的placement new和placement delete。同时,为了让用户主动使用delete时能进行正确操作,你需要同时定义一个普通形式的delete,来执行和placement delete同样的特殊实现。
- C++在global作用域内提供了不同形式的operator new,如果在class内声明任何operator news,会掩盖自动提供的operator new。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南