如果我写一个新的位置?我应该如何编写正常的运算符删除?

时间:2016-04-22 01:07:35

标签: c++ new-operator delete-operator placement-new

In" Effective C ++"第52项:如果您编写新的展示位置,请写入展示位置。

Meyers说,对于url,将调用placement new。但是,如果新的展示位置不会引发异常,我们会在客户端代码中进行删除:.updateField。然后,此Widget *pw = new (std::cerr) Widget;将仅调用正常删除,而不是放置删除。

然后,迈耶斯得出结论,你必须提供正常的操作员删除。那么,这个普通的运算符删除应该是什么样的呢?我认为这个普通的operator delete的内部应该类似于placement delete。

但是如果我使用普通的operator new而不是new来创建一个对象delete pw;,然后使用delete,那么它也会调用我为placement new写的普通运算符delete。但这似乎不对。

2 个答案:

答案 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;

的非展示位置重载”

因此,无需担心正常运算符删除中的放置删除。