C++ 在析构函数中执行任务

C++ 在析构函数中执行任务,c++,destructor,C++,Destructor,在析构函数中执行对象的重要/关键任务是一种好技术吗? 例如: 析构函数是一种在对象超出范围时自动清理对象所拥有资源的方法。在析构函数中不应执行任何其他操作。但清理可能涉及关键或复杂的处理。还要确保异常不会离开析构函数。如果由于另一个异常导致堆栈展开而最初调用了析构函数,那么这将导致程序意外终止 为关键清理/资源管理提供公共接口是一种很好的做法,这样客户机代码就可以调用它并在出现任何异常时进行处理。您可以检查清理过程是否在析构函数中完成,如果没有执行,则吞下抛出的任何异常 总之,在析构函数中执行除

在析构函数中执行对象的重要/关键任务是一种好技术吗? 例如:

析构函数是一种在对象超出范围时自动清理对象所拥有资源的方法。在析构函数中不应执行任何其他操作。但清理可能涉及关键或复杂的处理。还要确保异常不会离开析构函数。如果由于另一个异常导致堆栈展开而最初调用了析构函数,那么这将导致程序意外终止

为关键清理/资源管理提供公共接口是一种很好的做法,这样客户机代码就可以调用它并在出现任何异常时进行处理。您可以检查清理过程是否在析构函数中完成,如果没有执行,则吞下抛出的任何异常

总之,在析构函数中执行除资源清理之外的任何操作(无论是否关键)都不是一种好的做法。

析构函数是一种在对象超出范围时自动清理对象所持有资源的方法。在析构函数中不应执行任何其他操作。但清理可能涉及关键或复杂的处理。还要确保异常不会离开析构函数。如果由于另一个异常导致堆栈展开而最初调用了析构函数,那么这将导致程序意外终止

为关键清理/资源管理提供公共接口是一种很好的做法,这样客户机代码就可以调用它并在出现任何异常时进行处理。您可以检查清理过程是否在析构函数中完成,如果没有执行,则吞下抛出的任何异常


总之,在析构函数中执行除资源清理之外的任何操作(无论是否关键)都不是一个好的做法。

通常答案是否定的。例如,如果程序崩溃,析构函数将不会被调用。在其他情况下,不调用dtor。析构函数是专门用于清理的方法。类用户期望这样的行为。

通常答案是否定的。例如,如果程序崩溃,将不会调用析构函数。在其他情况下,不调用dtor。析构函数是专门用于清理的方法。类用户期望这样的行为。

这取决于任务是什么,以及它是否可以引发异常。此外,您不应该调用任何来自上述数据协议的虚拟“this”函数。关键的一点是:您不能在析构函数中抛出异常,一次只能处理一个异常。否则:crash@Pete为什么要在析构函数中避免虚拟成员调用?@Codor:因为它们将被分派到
MyObject
中函数的实现中,而不是分派到
MyObject
的派生类中可能存在的任何重写中。在执行<代码> ~MyObjult/Cuff>时,派生类析构函数已经被执行,因此C++拿走了调用派生类函数的特定机制。可能会出现这样一种情况,即发出调用并让它分派到基类是正确的和有原则的,但是如果您能够找到这种情况,那么您就足够聪明,知道忽略经验法则“不要这样做”:-)这取决于任务是什么,以及它是否可以抛出异常。此外,您不应该调用任何来自上述数据协议的虚拟“this”函数。关键的一点是:您不能在析构函数中抛出异常,一次只能处理一个异常。否则:crash@Pete为什么要在析构函数中避免虚拟成员调用?@Codor:因为它们将被分派到
MyObject
中函数的实现中,而不是分派到
MyObject
的派生类中可能存在的任何重写中。在执行<代码> ~MyObjult/Cuff>时,派生类析构函数已经被执行,因此C++拿走了调用派生类函数的特定机制。可能会出现这样一种情况,即发出调用并让它分派到基类是正确的和有原则的,但是如果您能找到这种情况,那么您就足够聪明,知道忽略经验法则“不要这样做”:-)我要指出“复杂处理的资源清理”例如,包括“提交事务”或更一般的“刷新输出”之类的内容。从您正在使用的数据存储的角度来看,这不仅仅是释放资源(实际上,它可能涉及分配资源,这也是您可能需要接受异常的原因之一)。但是,从你的类用户的角度来看,如果他们乐于尽最大努力获得成功,那么这就是清理,而如果他们需要响应失败,则不仅仅是清理(因此他们应该使用另一个接口)。例如,我要指出,“复杂处理的资源清理”包括“提交事务”之类的内容或者更一般地说是“刷新输出”。从您正在使用的数据存储的角度来看,这不仅仅是释放资源(实际上,它可能涉及分配资源,这也是您可能需要接受异常的原因之一)。但是,从你的类用户的角度来看,如果他们对尽最大努力取得成功感到满意,那么这就是清理,如果他们需要对失败做出反应,则不仅仅是清理(因此他们应该使用其他界面)。这取决于你对“重要/关键任务”的定义。STD::析构函数中的向量释放内存是一个重要的任务。如果整个程序崩溃,释放内存是不相关的。操作系统将在进程终止时执行此操作。但并非所有异常都会导致应用程序崩溃。它可能被其他地方的代码捕获、处理并恢复执行。所以析构函数至少需要尝试防止内存泄漏。这取决于你对“重要/关键任务”的定义。
class MyObject{
  ~MyObject() {
    Execute();
  }
  void Execute() {...}
};