4

在内部执行一些内存分配的析构函数中调用函数是否是一种好习惯。因为这给了我访问冲突和其他问题,假设

~Example(){
    Stop();
}

在这个函数中,Stop() 做了各种事情,还调用了各种其他函数?这是一个很好的做法。有人能帮忙吗?

4

6 回答 6

8

在析构函数中调用函数并没有错,唯一需要考虑的重要一点是析构函数中不应有未捕获的异常。

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

于 2013-06-17T18:35:50.107 回答
0

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

于 2013-06-17T18:36:31.353 回答
0

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

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

于 2013-06-17T18:37:34.630 回答
0

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

于 2013-06-17T18:37:51.740 回答
0

析构函数必须做什么直接来自类状态和设计。所以选择很渺茫。您可以内联或调用函数。我认为没有理由不调用函数,特别是如果其他成员函数也可能使用它。(即看到具有功能的智能指针的实现reset()......)

你有点暗示,如果工作很复杂,我们最好不要这样做。嗯。或者这个想法只是不在 dtor 中做,而是把这个义务留给程序员?就像回到C?Ingoring 认为 C++ 最吸引人的特性是拥有支持 RAII 的 dtors?

在 dtor 中要注意的一件特别的事情是吞下异常。运气好的话,它们自然不会发生。如果有机会,拥有一些公共功能来执行大部分任务确实是一个好主意,从那里投掷是公平的游戏。(即CFile类关闭 dtor 中的文件,如果它仍然打开。当用于输出文件时,你应该手动关闭它并处理可能的错误,例如无法刷新整个磁盘上的最后一个缓冲区。你做所有这些并且dtor 将从辛勤工作中解脱出来。

于 2013-06-17T18:51:25.330 回答
0

通过考虑以下 synarios 在析构函数中调用函数没有错

a) 除非函数是虚拟的

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

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

bob::~bob()
  {
   delete ptr;
   this->increment(p); // undefined behavior
  }

c) 防止析构函数抛出异常。

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

于 2013-06-17T19:28:23.040 回答