在析构函数中进行函数调用是一种好习惯吗?

时间:2012-07-18 19:05:22

标签: c++ destructor

假设对象的析构函数为:

anObject::~anObject()
{
    _functionCalledfromDestructor=1; //this sets the flag = 1
    functionCall(); //this function does something different than usual
                    //on seeing the flag
}

我的问题:

这种在析构函数中编码的样式/方法是一种很好的做法吗?

4 个答案:

答案 0 :(得分:10)

像这样的“隐藏频道”总是一个坏主意。函数的行为不应该依赖于不可见的状态。你可以给函数一个参数,然后在析构函数中传递一个值,在其他地方传递另一个值。如果您愿意,可以使用默认值作为更常见的情况。

答案 1 :(得分:7)

  

这种在析构函数中编码的样式/方法是一种很好的做法吗?

如果函数根据调用的位置执行两个不同的操作,那么您有两个函数,而不是一个。使这两个函数实际上是两个函数,你不需要问这个问题。

答案 2 :(得分:4)

一般来说,没有。我认为你最好做这样的事情:

class anObject 
{
private:
  void doSomethingInternal(bool fromDestructor) {...}
public:
  void doSomething() {doSomethingInternal(false);};
  virtual ~anObject() { doSomethingInternal(true); };
}

答案 3 :(得分:0)

在析构函数中调用函数通常不被认为是好的 练习,因为有可能抛出异常。这个 导致无法正确清理内存和异常行为 在析构函数中是未定义的。

以下是有关在析构函数中抛出异常的更多信息:

SP on throwing in the destructor

在您的情况下,通过公共接口进行明确定义的清理 是一个更好的方式去。例如,您可以提供Dispose 进行清理的方法。

考虑以下内容(伪代码):

public:
    void Dispose()
    {
        bool isDestructing = true;
        functionCall(isDestructing);
    }