【发布时间】:2016-04-22 01:07:35
【问题描述】:
在“Effective C++”第 52 条:如果你写placement new,写placement delete。
Meyers 说对于Widget *pw = new (std::cerr) Widget;,将调用placement new。但是如果放置 new 没有抛出异常,我们会在客户端代码中删除:delete pw;。然后,这个delete 只会调用普通删除,而不是放置删除。
Meyers 然后得出结论,您必须提供正常的操作符删除。那么,这个普通的 operator delete 应该是什么样子的呢?我认为这个普通操作员删除的内部应该类似于放置删除。
但是如果我使用普通操作符new而不是placement new来创建对象Widget *pw = new Widget;,然后使用delete pw,那么它也会调用我为placement new编写的普通操作符delete。但这似乎不对。
【问题讨论】:
-
一开始你不应该这样做,但如果你这样做了,就让自定义的
operator delete调用普通的。注意:如果您不提供带有与operator new对应的参数的operator delete,则代码可以编译但行为异常(内存泄漏)。 -
你的意思是我不应该这样做:“正常的运算符删除应该类似于放置删除”?@Cheersandhth.-Alf
-
不明白你的意思,抱歉。
-
我的意思是你认为我一开始就不应该做的事情。你能详细说一下吗?@Cheersandhth.-Alf
-
哦。你不应该做低级分配器的事情。
标签: c++ new-operator delete-operator placement-new