In" Effective C ++"第52项:如果您编写新的展示位置,请写入展示位置。
Meyers说,对于url
,将调用placement new。但是,如果新的展示位置不会引发异常,我们会在客户端代码中进行删除:.updateField
。然后,此Widget *pw = new (std::cerr) Widget;
将仅调用正常删除,而不是放置删除。
但是如果我使用普通的operator new而不是new来创建一个对象delete pw;
,然后使用delete
,那么它也会调用我为placement new写的普通运算符delete。但这似乎不对。
答案 0 :(得分:2)
这样的事情:
struct Widget {
Widget() { throw std::runtime_error(""); }
// custom placement new
static void* operator new(std::size_t sz, const std::string& msg) {
std::cout << "custom placement new called, msg = " << msg << '\n';
return ::operator new(sz);
}
// custom placement delete
static void operator delete(void* ptr, const std::string& msg)
{
std::cout << "custom placement delete called, msg = " << msg << '\n';
::operator delete(ptr);
}
};
int main()
{
try {
Widget* p1 = new ("widget") Widget;
}
catch(const std::exception& e) {
std::cout << e.what() << '\n';
}
}
答案 1 :(得分:0)
您不需要编写类似于展示位置删除的普通运算符删除。
相反,当您要删除按展示位置新设置的对象时,您必须通过delete pw
调用展示位置删除。如果您这样做,则不应该直接调用nohup script.sh &
,编译器会抱怨。在vs2013中,编译器将输出
无法删除指向此类对象的指针;该课程没有“操作员删除&#39;
的非展示位置重载”
因此,无需担心正常运算符删除中的放置删除。