考虑以下类:
struct S { ~S() = delete; };
简而言之,出于问题的目的:我无法像 S s{};
那样创建 S
的实例,因为我无法销毁它们。
正如评论中提到的,我仍然可以通过 S *s = new S;
创建一个实例,但我也不能删除它。
因此,我可以看到删除的析构函数的唯一用途是这样的:
struct S {
~S() = delete;
static void f() { }
};
int main() {
S::f();
}
也就是说,定义一个只公开一堆静态函数的类,并禁止任何尝试创建该类的实例。
已删除的析构函数还有哪些其他用途(如果有)?
最佳答案
如果您有一个永远不应该被delete
d 或存储在堆栈中(自动存储)或存储为另一个对象的一部分的对象,=delete
将阻止所有这些。
struct Handle {
~Handle()=delete;
};
struct Data {
std::array<char,1024> buffer;
};
struct Bundle: Handle {
Data data;
};
using bundle_storage = std::aligned_storage_t<sizeof(Bundle), alignof(Bundle)>;
std::size_t bundle_count = 0;
std::array< bundle_storage, 1000 > global_bundles;
Handle* get_bundle() {
return new ((void*)global_bundles[bundle_count++]) Bundle();
}
void return_bundle( Handle* h ) {
Assert( h == (void*)global_bundles[bundle_count-1] );
--bundle_count;
}
char get_char( Handle const* h, std::size_t i ) {
return static_cast<Bundle*>(h).data[i];
}
void set_char( Handle const* h, std::size_t i, char c ) {
static_cast<Bundle*>(h).data[i] = c;
}
这里我们有不透明的 Handle
s,它们可能不会在堆栈上声明或动态分配。我们有一个系统可以从已知数组中获取它们。
我相信以上都不是未定义的行为;未能销毁 Bundle
是可以接受的,就像在其位置创建一个新的一样。
并且界面不必公开 Bundle
的工作方式。只是一个不透明的句柄
。
现在,如果代码的其他部分需要知道所有句柄都在该特定缓冲区中,或者以特定方式跟踪它们的生命周期,则此技术会很有用。可能这也可以通过私有(private)构造函数和友元工厂函数来处理。
关于c++ - 析构函数的使用 = 删除;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40742918/