草庐IT

Destructor

全部标签

c++ - (Ab)使用构造函数和析构函数进行副作用不好的做法?备择方案?

在OpenGL中,经常会这样写代码:glPushMatrix();//modifythecurrentmatrixanduseitglPopMatrix();本质上是改变状态,然后执行一些使用新状态的Action,最后恢复状态。现在这里有两个问题:很容易忘记恢复状态。如果中间的代码抛出异常,则状态永远不会恢复。在真正的基于对象的编程风格中,我编写了一些实用程序类来克服这些问题,如下所示:structWithPushedMatrix{WithPushedMatrix(){glPushMatrix();}~WithPushedMatrix(){glPopMatrix();}};现在我可以像

c++ - (Ab)使用构造函数和析构函数进行副作用不好的做法?备择方案?

在OpenGL中,经常会这样写代码:glPushMatrix();//modifythecurrentmatrixanduseitglPopMatrix();本质上是改变状态,然后执行一些使用新状态的Action,最后恢复状态。现在这里有两个问题:很容易忘记恢复状态。如果中间的代码抛出异常,则状态永远不会恢复。在真正的基于对象的编程风格中,我编写了一些实用程序类来克服这些问题,如下所示:structWithPushedMatrix{WithPushedMatrix(){glPushMatrix();}~WithPushedMatrix(){glPopMatrix();}};现在我可以像

c++ - 显式调用时,析构函数被调用两次

我正在用这段代码在C++中试验析构函数:#includestructtemp{~temp(){std::cout我看到“你好!”正在打印两次。析构函数的调用不应该释放对象并且当它超出范围时不应该再次调用析构函数?还是有什么别的概念?(我不打算在实践中这样做。我只是想了解这里发生了什么。) 最佳答案 它发生是因为你告诉它发生。当变量超出范围时,自动变量的析构函数总是被调用。你也叫它。总共是两个电话。调用对象的析构函数并不意味着C++不再调用它,因为在正常执行中不需要跟踪。解决方案是永远不要手动调用你的析构函数。

c++ - 显式调用时,析构函数被调用两次

我正在用这段代码在C++中试验析构函数:#includestructtemp{~temp(){std::cout我看到“你好!”正在打印两次。析构函数的调用不应该释放对象并且当它超出范围时不应该再次调用析构函数?还是有什么别的概念?(我不打算在实践中这样做。我只是想了解这里发生了什么。) 最佳答案 它发生是因为你告诉它发生。当变量超出范围时,自动变量的析构函数总是被调用。你也叫它。总共是两个电话。调用对象的析构函数并不意味着C++不再调用它,因为在正常执行中不需要跟踪。解决方案是永远不要手动调用你的析构函数。

c++ - 析构函数是否被视为 const 函数?

考虑一下classFoo{public:Foo(){}~Foo(){}voidNonConstBar(){}voidConstBar()const{}};intmain(){constFoo*pFoo=newFoo();pFoo->ConstBar();//NoerrorpFoo->NonConstBar();//CompileerroraboutnonconstfunctionbeinginvokeddeletepFoo;//Noerrorreturn0;}在主函数中,我同时调用Foo的const和nonconst函数尝试调用任何非const函数会在VisualStudio中产生类似

c++ - 析构函数是否被视为 const 函数?

考虑一下classFoo{public:Foo(){}~Foo(){}voidNonConstBar(){}voidConstBar()const{}};intmain(){constFoo*pFoo=newFoo();pFoo->ConstBar();//NoerrorpFoo->NonConstBar();//CompileerroraboutnonconstfunctionbeinginvokeddeletepFoo;//Noerrorreturn0;}在主函数中,我同时调用Foo的const和nonconst函数尝试调用任何非const函数会在VisualStudio中产生类似

c++ - 我们什么时候需要定义析构函数?

这个问题在这里已经有了答案:WhatisTheRuleofThree?(8个回答)关闭8年前。我读到当我们有指针成员和定义基类时需要定义析构函数,但我不确定我是否完全理解。我不确定的一件事是定义默认构造函数是否无用,因为默认情况下总是给我们一个默认构造函数。另外,我不确定我们是否需要定义默认构造函数来实现RAII原则(我们是否只需将资源分配放在构造函数中而不定义任何析构函数?)。classA{public:~Account(){delete[]brandname;deleteb;//doweneedtodefineit?};something(){}=0;//virtualfuncti

c++ - 我们什么时候需要定义析构函数?

这个问题在这里已经有了答案:WhatisTheRuleofThree?(8个回答)关闭8年前。我读到当我们有指针成员和定义基类时需要定义析构函数,但我不确定我是否完全理解。我不确定的一件事是定义默认构造函数是否无用,因为默认情况下总是给我们一个默认构造函数。另外,我不确定我们是否需要定义默认构造函数来实现RAII原则(我们是否只需将资源分配放在构造函数中而不定义任何析构函数?)。classA{public:~Account(){delete[]brandname;deleteb;//doweneedtodefineit?};something(){}=0;//virtualfuncti

c++ - 如果派生类析构函数抛出异常,基类析构函数会发生什么

刚好发生在我身上,我想知道在以下情况下如何释放资源。classBase{Resource*r;public:Base(){/*...*/}~Base(){deleter;}};classDerived:publicBase{public:Derived(){/*...*/}~Derived(){/*Suddenlysomethingherethrows!*/}};intmain(){try{Derivedd;}catch(...){/*whathappenedwithBase::r!?*/}}如果派生类析构函数抛出,会调用基类析构函数吗?还是会漏水? 最佳答

c++ - 如果派生类析构函数抛出异常,基类析构函数会发生什么

刚好发生在我身上,我想知道在以下情况下如何释放资源。classBase{Resource*r;public:Base(){/*...*/}~Base(){deleter;}};classDerived:publicBase{public:Derived(){/*...*/}~Derived(){/*Suddenlysomethingherethrows!*/}};intmain(){try{Derivedd;}catch(...){/*whathappenedwithBase::r!?*/}}如果派生类析构函数抛出,会调用基类析构函数吗?还是会漏水? 最佳答