在内部执行一些内存分配的析构函数中调用函数是否是一种好习惯。因为这给了我访问冲突和其他问题,假设
~Example(){
Stop();
}
在这个函数中,Stop() 做了各种事情,还调用了各种其他函数?这是一个很好的做法。有人能帮忙吗?
在内部执行一些内存分配的析构函数中调用函数是否是一种好习惯。因为这给了我访问冲突和其他问题,假设
~Example(){
Stop();
}
在这个函数中,Stop() 做了各种事情,还调用了各种其他函数?这是一个很好的做法。有人能帮忙吗?
在析构函数中调用函数并没有错,唯一需要考虑的重要一点是析构函数中不应有未捕获的异常。
所以,只要你捕获了析构函数内的析构函数中调用的函数抛出的所有异常,你就安全了。
只要它是释放/释放过程的一部分,就可以从析构函数调用方法。不建议执行反向操作(获取资源/内存)。
std::bad_alloc
当 a被抛出时,即当内存分配失败时,会调用析构函数(除其他外) 。在这种情况下,在析构函数(或析构函数调用的函数)中分配内存也可能会失败,引发异常。
从析构函数中抛出异常是一个非常糟糕的主意。现在,析构函数可以捕捉到那一秒std::bad_alloc
,但我怀疑它是否有必要的手段来适当地处理它。
正如其他人所说,这没关系,但可能很危险。请记住,类的某些部分可能已经被破坏,因此您可能无法使用类中的所有内容。另外,尝试在方法中处理异常。
析构函数必须做什么直接来自类状态和设计。所以选择很渺茫。您可以内联或调用函数。我认为没有理由不调用函数,特别是如果其他成员函数也可能使用它。(即看到具有功能的智能指针的实现reset()
......)
你有点暗示,如果工作很复杂,我们最好不要这样做。嗯。或者这个想法只是不在 dtor 中做,而是把这个义务留给程序员?就像回到C?Ingoring 认为 C++ 最吸引人的特性是拥有支持 RAII 的 dtors?
在 dtor 中要注意的一件特别的事情是吞下异常。运气好的话,它们自然不会发生。如果有机会,拥有一些公共功能来执行大部分任务确实是一个好主意,从那里投掷是公平的游戏。(即CFile
类关闭 dtor 中的文件,如果它仍然打开。当用于输出文件时,你应该手动关闭它并处理可能的错误,例如无法刷新整个磁盘上的最后一个缓冲区。你做所有这些并且dtor 将从辛勤工作中解脱出来。
通过考虑以下 synarios 在析构函数中调用函数没有错
a) 除非函数是虚拟的
http://www.artima.com/cppsource/nevercall.html
b) 避免调用访问已被销毁的数据成员的成员函数
bob::~bob()
{
delete ptr;
this->increment(p); // undefined behavior
}
c) 防止析构函数抛出异常。
如果由于异常而调用析构函数,则应用程序将终止。