草庐IT

Destructor

全部标签

c++ - 用 return 语句结束析构函数是否安全?

在我的双向链表类中,我正在编写我的析构函数,这是我的代码:DLinkedList::~DLinkedList(){if(head==NULL){return;}//Othercode}用return;语句结束析构函数是否安全?我知道我可以用return;语句结束我的void函数,但这是一个析构函数。 最佳答案 Isitsafetoendadestructorwithreturn;statement?IknowthatIcanendmyvoidfunctionswithareturn;statement,butthisisadestr

c++ - 用 return 语句结束析构函数是否安全?

在我的双向链表类中,我正在编写我的析构函数,这是我的代码:DLinkedList::~DLinkedList(){if(head==NULL){return;}//Othercode}用return;语句结束析构函数是否安全?我知道我可以用return;语句结束我的void函数,但这是一个析构函数。 最佳答案 Isitsafetoendadestructorwithreturn;statement?IknowthatIcanendmyvoidfunctionswithareturn;statement,butthisisadestr

c++ - 析构函数和 noexcept

我对析构函数和noexcept有点困惑。我的理解是,在C++11中,任何析构函数,包括用户定义的,都是隐含的noexcept(true),即使我们从中throw也是如此。如果出于某种原因他们希望这样,则必须明确指定noexcept(false)。我看到完全相反的情况——在GCC4.7.2中,用户定义的析构函数,无论类和析构函数多么原始,都是隐含的noexcept(false)。我在这里想念什么?用户定义的析构函数是否存在一些隐藏的问题? 最佳答案 这是knownbug(归功于OP查找错误报告),并且它似乎已在GCC4.8.0中修复。

c++ - 析构函数和 noexcept

我对析构函数和noexcept有点困惑。我的理解是,在C++11中,任何析构函数,包括用户定义的,都是隐含的noexcept(true),即使我们从中throw也是如此。如果出于某种原因他们希望这样,则必须明确指定noexcept(false)。我看到完全相反的情况——在GCC4.7.2中,用户定义的析构函数,无论类和析构函数多么原始,都是隐含的noexcept(false)。我在这里想念什么?用户定义的析构函数是否存在一些隐藏的问题? 最佳答案 这是knownbug(归功于OP查找错误报告),并且它似乎已在GCC4.8.0中修复。

c++ - "= default"析构函数和空析构函数有什么区别?

我想阻止我的类的用户将它用作自动变量,所以我编写了这样的代码:classA{private:~A()=default;};intmain(){Aa;}我希望代码不会被编译,但是g++编译它没有错误。但是,当我将代码更改为:classA{private:~A(){}};intmain(){Aa;}现在,g++给出了~A()是私有(private)的错误,正如我所期望的那样。“=default”析构函数和空析构函数有什么区别? 最佳答案 您的第一个示例不应编译。这表示它确实编译的编译器中的一个错误。此错误已在gcc4.9及更高版本中修复

c++ - "= default"析构函数和空析构函数有什么区别?

我想阻止我的类的用户将它用作自动变量,所以我编写了这样的代码:classA{private:~A()=default;};intmain(){Aa;}我希望代码不会被编译,但是g++编译它没有错误。但是,当我将代码更改为:classA{private:~A(){}};intmain(){Aa;}现在,g++给出了~A()是私有(private)的错误,正如我所期望的那样。“=default”析构函数和空析构函数有什么区别? 最佳答案 您的第一个示例不应编译。这表示它确实编译的编译器中的一个错误。此错误已在gcc4.9及更高版本中修复

c++ - 如何从析构函数调用 const 成员函数

当const对象被销毁时,有没有办法从析构函数中调用const成员函数?考虑:structMy_type{~My_type(){show();}voidshow(){cout及用法:My_typemt;constMy_typecmt;mt.show();cmt.show();输出:voidshow()voidshow()constvoidshow()voidshow()有人能解释一下为什么当cmt被销毁时没有调用const版本的show吗? 最佳答案 在const实例上调用非常量重载的原因是因为在销毁期间不考虑当前实例上的cv限定符

c++ - 如何从析构函数调用 const 成员函数

当const对象被销毁时,有没有办法从析构函数中调用const成员函数?考虑:structMy_type{~My_type(){show();}voidshow(){cout及用法:My_typemt;constMy_typecmt;mt.show();cmt.show();输出:voidshow()voidshow()constvoidshow()voidshow()有人能解释一下为什么当cmt被销毁时没有调用const版本的show吗? 最佳答案 在const实例上调用非常量重载的原因是因为在销毁期间不考虑当前实例上的cv限定符

c++ - 为什么不能显式调用构造函数而析构函数可以?

在下面的C++代码中,我可以显式调用析构函数,但不能显式调用构造函数。这是为什么?在dtor的情况下,不是更明确的ctor调用expressive和unified吗?classX{};intmain(){X*x=(X*)::operatornew(sizeof(X));new(x)X;//option#1:OKx->X();//option#2:ERRORx->~X();::operatordelete(x);} 最佳答案 因为在构造函数启动之前,该地址没有X类型的对象。因此,将x取消引用为X类型或访问它的成员/方法将是未定义的行为

c++ - 为什么不能显式调用构造函数而析构函数可以?

在下面的C++代码中,我可以显式调用析构函数,但不能显式调用构造函数。这是为什么?在dtor的情况下,不是更明确的ctor调用expressive和unified吗?classX{};intmain(){X*x=(X*)::operatornew(sizeof(X));new(x)X;//option#1:OKx->X();//option#2:ERRORx->~X();::operatordelete(x);} 最佳答案 因为在构造函数启动之前,该地址没有X类型的对象。因此,将x取消引用为X类型或访问它的成员/方法将是未定义的行为