原则52:写了placement new也要写placement delete

这个原则表面上看起来像是在谈new和delete必须配对使用,其实不然。作者是在谈如果你写了new,那么你必须保证在任何情况下都有对应的delete被调用。这里所说的new不仅仅是指系统默认的new操作符,同理,delete也是一样。
作者所提的具体的场景是new分配空间没有问题,但是构造函数却抛出了异常。这样new分配出来的空间没有被使用,如果没有相应的delete撤销分配的话,那么这段空间就会被永远闲职,从而造成内存泄露。
问题是现在这个new往往是自定义的那种,而delete却不是,这就会造成new和delete之间的不匹配,从而没有合适的delete被调用,因此可能出现内存泄露。
系统是怎么判断一个new和一个delete是相互匹配的呢?是根据形式。这包括形参列表、参数类型、返回值类型甚至可能包括异常抛出类型。所以如果你自定义了一种new,那么你同时也肩负了自定义与该new配对的delete的责任。
在此原则中作者还提及了不同作用域同名覆盖问题的解决方法。
主要是类域覆盖全局域和子类域覆盖父类域的情况。作者解决这个问题的方法就是建立一个类去包含所有new和delete,当你想使用的时候就显式调用。
总结:
1、当你写了一个placement new就必须也得写一个placement delete,否则你的程序可能存在内存泄露的隐患。
2、当你写了placement new和placement delete,请确定不要覆盖它们的正常版本。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容