在c++的析构函数中调用函数是一种好做法吗?

Is it a good practice to call a function inside a destructor in C++

本文关键字:一种 析构函数 c++ 调用 函数      更新时间:2023-10-16

在内部分配内存的析构函数中调用函数是一个好做法吗?因为这会给我访问冲突和其他问题,假设

~Example(){
    Stop();
}

在这个函数Stop()做各种事情,也调用各种其他函数?这是一个很好的练习吗?有人能帮忙吗?

在析构函数内部调用函数没有什么错,唯一需要考虑的重点是析构函数不应该发出未捕获的异常。

因此,只要在析构函数内部捕获析构函数中调用的函数抛出的所有异常,就安全了。

从析构函数调用方法是可以的,只要它是释放/释放过程的一部分。不建议反向操作(获取资源/内存)

正如其他人所说,这是可以的,但可能是危险的。请记住,类的某些部分可能已经被销毁,因此您可能无法使用类中的所有内容。此外,尝试在方法内部处理异常。

析构函数在抛出std::bad_alloc时(即当内存分配失败时)被调用。在这种情况下,在析构函数(或由析构函数调用的函数)中分配内存也可能失败,引发异常。

从析构函数抛出异常是一个非常糟糕的主意。现在,析构函数可以捕获第二个std::bad_alloc,但我怀疑它是否有必要的手段来适当地处理它。

析构函数必须做的事情直接取决于类的状态和设计。所以选择余地很小。你可以内联或者调用一个函数。我看不出为什么不调用一个函数,特别是如果其他成员函数也可能使用它。(即参见具有reset()函数的智能指针的实现…)

你有点暗示如果工作很复杂,我们最好不要做。嗯。或者这个想法只是不直接做,而是把这个义务留给程序员?回到C?忽略了c++最吸引人的特性是拥有启用RAII的函数吗?

看医生要特别注意的一件事是吞下异常。运气好的话,这种事自然不会发生。如果有机会,让一些公共功能来执行大多数任务确实是一个好主意,从那里投掷是公平的游戏。(即CFile类关闭文件在博士,如果它仍然打开。当用于输出文件时,您应该手动关闭它并处理可能的错误,例如无法刷新整个磁盘上的最后一个缓冲区。你把这些都做完,医生就可以从繁重的工作中解脱出来了。

在析构函数中调用函数没有错,只要考虑以下情况

a)除非函数是虚函数

http://www.artima.com/cppsource/nevercall.html

b)避免调用访问已经销毁的数据成员的成员函数

bob::~bob()
  {
   delete ptr;
   this->increment(p); // undefined behavior
  }
c)防止析构抛出异常。

如果由于异常已经存在而调用析构函数,应用程序将终止。