这个原则表面上看起来像是在谈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,请确定不要覆盖它们的正常版本。
原则52:写了placement new也要写placement delete
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 题目内容: class Fruit{int no;double weight;char key;public:vo...
- 1.Big Three 当我们定义一个类以后有,如果没实现这拷贝构造函数、拷贝复制函数和析构函数,编译器会自动为我...
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...