在C++中,在析构函数内调用函数是一个好的实践吗?

4

在析构函数中调用一个内部进行内存分配的函数是一个好的实践吗?因为这会导致访问冲突和其他问题。例如

~Example(){
    Stop();
}

在这个函数中,Stop()执行各种操作,并调用其他函数。这是一种好的实践吗?可以有人帮忙吗?

6个回答

8

在析构函数中调用函数是没有问题的,但需要考虑一个重要因素:析构函数中不应该有未捕获的异常。

只要在析构函数内部捕获所有从被调用函数中抛出的异常,就能保证安全性。


谢谢Alok。我还有一个问题。我的应用程序经常遇到访问冲突,因为尝试访问或清除不可访问的堆内存位置。你能告诉我解决这个问题要看哪些基本事项吗? - user1767288
不要使用 new 关键字。不要使用数组。 - Oswald
1
最好的建议:#1.尽可能少使用动态内存,最好的C++程序是尽可能少使用new的程序。由于#1实际上是不可能的,所以#2使用智能指针而不是裸指针。在任何情况下,如果您仍然遇到内存访问违规问题,请使用内存分析器工具(如valgrind)检查程序中与内存相关的错误问题。顺便说一句,如果您正确遵循#1和#2,那么您需要#3的可能性较小。 - Alok Save
感谢Alok和Oswald。 - user1767288
@user1767288:你应该将这样的问题单独提出来,而不是引发讨论。 - Balog Pal
@Balog Pal 谢谢你,Balog Pal。我下次会注意的。我是这个群的新成员,所以我在这里发帖。 - user1767288

0

在以下情况下,在析构函数中调用函数是没有问题的:

a)除非该函数是虚函数

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

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

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

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

如果因为异常而调用析构函数,应用程序将会终止。


0

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


0

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

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


0

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


0

析构函数必须直接遵循类的状态和设计。因此选择很少。您可以内联执行或调用函数。我认为没有理由不调用函数,特别是如果其他成员函数也可能使用它。(即查看具有reset()函数的智能指针的实现...)

您有点暗示如果工作复杂,最好不要做。嗯。或者想法只是不在dtor中执行它,而是将该义务留给程序员?就像回到C一样?忽略了C++最吸引人的功能,即具有启用RAII的dtors吗?

在dtor中需要特别注意的一件事是吞咽异常。有些时候它们自然不会发生。如果有机会,确实有一个好主意是有一些公共函数来执行大部分任务,从那里抛出异常是公平的游戏。(即CFile类在dtor中关闭文件(如果仍然打开)。当用于输出文件时,您应该手动关闭它并处理可能的错误,例如无法刷新最后一个缓冲区。您完成所有这些工作,dtor将从繁重的工作中解脱出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接