草庐IT

Destructor

全部标签

c++ - "The Rule of Zero"是否也适用于具有虚方法的类?

我找到了TheruleofZero正如在PeterSommerladsSlides中也提到的那样(第32页)非常引人注目。虽然,我似乎记得有一个严格的规则,必须定义析构函数virtual,如果类有虚拟成员并且实际上是派生的。structBase{virtualvoiddrawYourself();virtual~Base(){}};structDerived:publicBase{virtualvoiddrawYourself();};析构函数的主体甚至可以是空的(它只需要vtbl中的条目)。我好像记得用hierarchy的时候intmain(){Base*obj=newDerived

c++ - 为什么在析构函数中抛出异常时不调用重载删除?

我编写了以下代码,它重载了new和delete运算符并在析构函数中抛出异常。当抛出异常时,为什么delete操作符中的代码没有执行(并打印出“bye”)?如果不应该执行,(如何)释放内存?是oneoftheotherdeleteoperators叫什么?重载其中之一会导致执行相应的代码吗?还是内stub本没有被释放,因为破坏失败意味着它可能不应该被释放?#includeusingnamespacestd;classA{public:A(){}~A()noexcept(false){throwexception();}void*operatornew(std::size_tcount){

c++ - 我可以依赖函数范围的静态变量来调用程序关闭期间调用的方法吗?

快速上下文:我看到程序关闭时出现错误,这些错误源于全局成员之间的依赖关系(::sigh::,我知道,我知道)。一个全局变量的析构函数可能引用另一个全局变量——如果那个全局变量已经被破坏,事情就会变得糟糕。但这是一个我不知道行为是否明确定义的特殊情况:函数内的静态变量。即使在程序关闭期间,我是否可以依赖函数的行为始终如一?或者是否有可能静态成员将被销毁,并且该函数将运行而不创建新成员?这是一个玩具示例,展示了我感兴趣的内容:classLogger{public:enumclassSeverity{DEBUG,INFO,WARNING,ERROR};voidLog(Severitysev,

c++ - 如果更改 const 对象是未定义的行为,那么构造函数和析构函数如何使用写访问权限进行操作?

C++标准规定修改最初声明为const的对象是未定义的行为。那么构造函数和析构函数是如何运行的呢?classClass{public:Class(){Change();}~Class(){Change();}voidChange(){data=0;}private:intdata;};//later:constClassobject;//object.Change();-won'tcompileconst_cast(object).Change();//compiles,butit'sundefinedbehavior我的意思是构造函数和析构函数与调用代码做完全相同的事情,但允许它们更

c++ - 重新分配变量时,不调用析构函数.. (C++)

当一个变量被重新赋值时,析构函数不会被调用:Objectfoo=Object(a,b);foo=Object(c,d);因此,析构函数只会在Object(c,d)作用域的末尾被调用,这显然会导致问题。现在,在这种特定情况下,我并不太在意:声明2个不同的对象就足够了:Objectfoo1=Object(a,b);Objectfoo2=Object(c,d);这样两个对象的析构函数都会在最后调用。但是,在某些情况下我必须需要重新分配变量,即在对象构造函数中,例如:SuperObject(Pointpoint1,Pointpoint2):delay_object_(DelayObject(0

c++ - 使用继承在 C++ 中调用析构函数和销毁成员变量的顺序是什么?

与这些问题非常相似,但不完全相同:WhatistheorderinwhichthedestructorsandtheconstructorsarecalledinC++Orderofmemberconstructoranddestructorcalls我想知道:派生类的成员变量是在调用基类的析构函数之前还是之后销毁的?这是在C++中使用VisualStudio2008。谢谢。 最佳答案 构造函数:先基后导出破坏:~派生~成员派生~基地~成员(member)群代码:classmember{strings;public:member(s

c++ - 伪析构函数调用不会破坏对象

考虑以下代码:#includetypedefintt;ta=42;intmain(){a.t::~t();std::cout我预计a将被销毁。但事实并非如此,为什么?那个伪析构函数调用是如何销毁对象的? 最佳答案 Butitisnottrue,why?§5.2.4/1:Theonlyeffectistheevaluationofthepostfix-expressionbeforethedotorarrow.其中postfix-expression是发生调用的对象的表达式。因此,伪析构函数调用,作为对普通析构函数的调用,不会结束它所

c++ - 为什么析构函数只被调用一次?

#includeusingnamespacestd;classTest{public:Test(){printf("construct..\n");}~Test(){printf("destruct...\n");}};TestGet(){Testt=Test();returnt;}intmain(intargc,char*argv[]){Testt=Get();return0;}控制台输出是:$g++-g-Wall-O0testdestructor.cc$./a.out构造..破坏... 最佳答案 这是因为当您从函数返回值时编译器

c++ - 模板化上下文中的显式析构函数

我想在模板上下文中显式销毁一个vector。以下适用于我(GNUC++4.3、4.4和Clang++1.1):templatevoiddestroy_vector_owner(VectorOwner*obj){obj->v.~vector();//furthercleanupbyPythonAPIfunctionsomitted}虽然它在MacOSXv10.5的g++(i686-apple-darwin10-gcc-4.2.1)上失败了expectedclass-namebefore‘(’token如果我把它改成obj->v.~vector();代码无法用G++编译,但Clang仍然可

c++ - 覆盖 std :exception 的析构函数

如果line8被注释,则以下程序无法在g++4.4中编译。为什么?似乎当我重写std::exception构造函数时,我也必须重写它的析构函数。这是什么原因?#include#includeusingnamespacestd;classA:publicexception{public:A(stringmsg):_msg(msg){}//~A()throw(){};//line8constchar*what()constthrow(){return_msg.c_str();}private:string_msg;};intmain(){}编译错误为:error:looserthrowsp