C++11 析构函数 = 删除
C++11 Destructor = delete
我在这里看到了构造函数=删除的解释,但我想知道我是否也应该禁止析构函数调用。我正在尝试使用这样的类:
class A
{
public:
static bool foo(const char* filePath);
static void foo(const int something);
private:
A() = delete;
~A();
};
我也应该像~A() = delete;
一样写作吗?这甚至重要吗?
~A() = delete;
是多余的,因为由于您无法创建对象,因此无需担心析构函数。
事实上,使用你的代码甚至不需要A() = delete;
,因为所有的类成员都是static
的。
正如卢基安在评论中正确提到的那样,这样的class
最好被宣布为namespace
。根据要求,可以对基础数据进行extern
/static
。
(注意:在 C++20 中,删除聚合的构造函数现在会使该类型无法构造,因此不再有意外行为)
若要在此处添加其他答案,可能需要将析构函数声明为已删除,而不是私有且未实现。这是因为,即使删除了private
构造函数,您仍然可以使用聚合初始化来创建实例:
演示
class A
{
public:
static bool foo(const char* filePath);
static void foo(const int something);
private:
A() = delete;
};
int main(){
A a{}; // whoops I just created an instance
}
但是,如果将析构函数声明为已删除,则默认构造或聚合初始化都不起作用 - 它无法编译,因为编译器无法调用析构函数进行A
†
演示
class A
{
public:
static bool foo(const char* filePath);
static void foo(const int something);
~A() = delete;
};
int main(){
A a{}; // fails
A b; // fails
}
由于您已经将析构函数声明为私有且未实现,因此所有其他内容都是多余的。C++11 使它更容易,因为你不需要private
,只需= delete
析构函数。最好将析构函数显式声明为已删除,因为它会向其他程序员传达您从未打算实现它的信息。你拥有它的方式,一些程序员最初可能会认为你只是忘记包含实现。
您需要将默认构造函数和析构函数都声明为已删除,以防止动态内存分配(通过 new
或放置 new),否则我们不会收到编译错误,因为现在由我们调用delete
或显式调用析构函数。如果我们方便地忘记了,那么事情就很好了:
演示
class A
{
public:
static bool foo(const char* filePath);
static void foo(const int something);
~A() = delete;
};
int main(){
A* a = new A(); // whoops I created an instance
// we leak memory
}
放置新演示
但是删除构造函数和析构函数可以防止这种情况:
演示
class A
{
public:
static bool foo(const char* filePath);
static void foo(const int something);
~A() = delete;
A() = delete;
};
int main(){
A* a = new A(); // doesnt compile
A b{}; // doesn't compile
A c; // doesn't compile
}
†请参阅 [class.dtor]:"如果可能调用的析构函数被删除或无法从调用上下文中访问,则程序格式不正确。
不,没关系。您也可以将其删除,但如果删除构造函数,则删除析构函数不会执行任何其他操作。
第一个(已删除的构造函数)告诉无法创建对象。第二个(已删除析构函数)告诉无法销毁对象。
请注意,可以使用各种技巧"创建"和初始化对象,但在这种情况下,所有赌注都关闭了,程序正在执行未定义的行为。
- MSVC 编译器/链接器何时合成标量/矢量删除析构函数
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 删除析构函数C++中的指针
- bad_alloc::'标量删除析构函数'(无符号整数)当我尝试创建矢量 470MB 大小时
- 这是删除析构函数中的数组的正确方法吗?
- 尽管使用了 boost::scoped_ptr,我们是否应该删除析构函数中成员的指针
- 调用remove()删除析构函数中的文件是否安全
- 当存储在std::vector属性中时,我可以删除析构函数中的指针吗
- 删除析构函数中的(这个)指针
- C++ 删除析构函数中的向量类成员内存
- 删除析构函数中的指针和映射
- 尝试删除析构函数中已删除的指针
- 为什么允许我声明一个带有已删除析构函数的对象
- 为什么在删除析构函数时调用析构函数,如果未删除则不调用析构函数?
- 删除析构函数的意义何在
- std::istream子类:删除析构函数中的streambuf
- 如何安全地删除析构函数中的线程指针
- 标量删除析构函数问题
- C++11:我可以创建一个类型具有已删除析构函数的字段吗
- 为什么在 VC 中,'delete' 和 'delete []' 都使用标量删除析构函数?