【发布时间】:2021-06-05 06:32:16
【问题描述】:
C++20 增加了 operator delete 的破坏形式,由 std::destroying_delete_t 参数区分。它会导致 delete 表达式在调用 operator delete 之前不再销毁对象。
目的是在显式调用对象的析构函数和释放内存之前,允许以依赖于对象状态的方式自定义删除。
但是,我不清楚在实现这样的运算符时,我是否真的需要销毁对象。具体来说,我是否允许拥有一个静态对象池,并将它们分配给用户,这些用户随后可以将它们视为动态分配的?这样在对象上执行的delete 表达式只会将其返回到池中而不会破坏它。例如,以下程序是否定义明确?
#include <new>
struct A {
virtual ~A() = default;
};
// 'Regular' dynamically allocated objects
struct B : A {
static A* create() {
return new B();
}
private:
B() = default;
};
// Pooled, statically allocated objects
struct C : A {
static A* create() {
for (auto& c: pool) {
if (!c.in_use) {
c.in_use = true;
return &c;
}
}
throw std::bad_alloc();
}
private:
static C pool[3];
bool in_use = false;
C() = default;
void operator delete(C *c, std::destroying_delete_t) {
c->in_use = false;
}
};
C C::pool[3];
// Delete them identically via the common interface.
void do_something_and_delete(A* a) {
delete a;
}
int main() {
do_something_and_delete(B::create());
do_something_and_delete(B::create());
do_something_and_delete(C::create());
do_something_and_delete(C::create());
}
【问题讨论】:
标签: c++ language-lawyer c++20 delete-operator