gpt4 book ai didi

c++ - 如果我写一个placement new?我应该怎么写普通的operator delete?

转载 作者:行者123 更新时间:2023-11-28 02:07:55 26 4
gpt4 key购买 nike

《Effective C++》第52条:Write placement delete if you write placement new。

Meyers 说对于 Widget *pw = new (std::cerr) Widget;,placement new 将被调用。但是如果 placement new 没有抛出异常,我们就会在客户端代码中删除:delete pw;。然后,这个delete 将只调用普通删除,而不是放置删除。

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

但是如果我使用普通的 operator new 而不是 placement new 来创建对象 Widget *pw = new Widget;,然后使用 delete pw,那么它将也可以调用我为新放置而编写的普通运算符 delete。但这似乎不对。

最佳答案

像这样:

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';
}
}

关于c++ - 如果我写一个placement new?我应该怎么写普通的operator delete?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36782963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com