c++ - 析构函数的使用 = 删除;

标签 c++ c++11 destructor

考虑以下类:

struct S { ~S() = delete; };

简而言之,出于问题的目的:我无法像 S s{}; 那样创建 S 的实例,因为我无法销毁它们。
正如评论中提到的,我仍然可以通过 S *s = new S; 创建一个实例,但我也不能删除它。
因此,我可以看到删除的析构函数的唯一用途是这样的:

struct S {
    ~S() = delete;
    static void f() { }
};

int main() {
    S::f();
}

也就是说,定义一个只公开一堆静态函数的类,并禁止任何尝试创建该类的实例。

已删除的析构函数还有哪些其他用途(如果有)?

最佳答案

如果您有一个永远不应该被deleted 或存储在堆栈中(自动存储)或存储为另一个对象的一部分的对象,=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;
}

这里我们有不透明的 Handles,它们可能不会在堆栈上声明或动态分配。我们有一个系统可以从已知数组中获取它们。

我相信以上都不是未定义的行为;未能销毁 Bundle 是可以接受的,就像在其位置创建一个新的一样。

并且界面不必公开 Bundle 的工作方式。只是一个不透明的句柄

现在,如果代码的其他部分需要知道所有句柄都在该特定缓冲区中,或者以特定方式跟踪它们的生命周期,则此技术会很有用。可能这也可以通过私有(private)构造函数和友元工厂函数来处理。

关于c++ - 析构函数的使用 = 删除;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40742918/

相关文章:

c++ - 从二维数组到一维数组的转换

c++ - Qt:如何将两个小部件(比如 QPushButton)添加到状态栏,一个在左侧,另一个在右侧?

c++ - 静态常量匿名 union 使用 GCC 4.9.3 给出 "uninitialized const"错误

c++ - 使用指向元素的指针进行多维数组索引

c++ - 从析构函数中停止线程的正确方法

c++ - 在编译时将类型转换为整数?

c++ - 在 C++11 中,临时 T 是否应该作为参数调用 T(const T&) 或 T(T&&)?

c++ - 初始化时统一初始化还是直接初始化?

c++ - 复制构造函数调用析构函数 C++

c++ - 有没有办法保证析构函数的相对顺序?