c++ - 析构函数上的 =delete 如何防止堆栈分配?

标签 c++ c++11 delete-operator

在此SO question声明此构造可防止实例的堆栈分配。

class FS_Only {
    ~FS_Only() = delete;  // disallow stack allocation
};

我的问题是,它如何防止分配?我了解,无论是显式还是隐式,都无法删除此实例。但我认为,这会分别导致内存泄漏或运行时错误。

编译器是否足够聪明,可以解决这个问题并引发编译器错误?还有为什么需要这个?

最佳答案

具有自动存储持续时间的变量(即局部变量)的析构函数需要在变量的生命周期结束时运行。如果没有可访问的析构函数,编译器将拒绝编译分配此类变量的代码。

基本上,“堆栈分配”(顺便说一下,术语选择不准确)和自由存储分配之间的区别在于,使用局部变量的构造函数/析构函数调用总是成对出现,而使用自由存储分配,您可以构造一个没有永远破坏它。因此,通过阻止对析构函数的访问,您的代码无法分配该类型的局部变量(如果构造函数运行,析构函数也必须运行,但没有析构函数,因此程序被拒绝)。

关于c++ - 析构函数上的 =delete 如何防止堆栈分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18847739/

相关文章:

c++ - 删除包含动态指针的 STL::list<class something> 类

android - JNI 检测到应用程序错误 : can't call void android. graphics.Canvas.drawBitmap

c# - 在 C# 中直接从 char int 转换为 char

c++ - GAlib C++ 获取每一代的精华

c++ - 如何在 C++ 列表中保存计时时间

c++ - decltype 作为类成员函数中的返回类型

c++ - 允许对具有相同底层结构的类型进行隐式转换

c++ - 非结构对象布局

c++ - 删除动态分配的数组与单个指针

c++ - 动态分配其中包含 vector 的结构