2014-10-29 76 views
-1

在C++中,如果非RAII类具有用户定义的析构函数,那么它是一个好设计吗?非RAII类是否需要用户定义的析构函数?

+1

什么是非RAII类? – juanchopanza 2014-10-29 13:21:22

+0

好的,说RAII我是指类的主要目标是获取和释放资源。非RAII类是一个有其他目标的类。 – 2014-10-29 13:25:59

+0

不知道我明白..你能用这样的代码做一个这样的类的例子吗? – 2014-10-29 13:26:57

回答

0

如果类不需要释放任何资源(或执行任何操作),并且不需要为虚拟函数表创建空的析构函数,那么最好不要定义析构函数在所有(见零规则)。

1

有两个常见的“经验法则”涵盖了这一点。

第一个是五法则(在C++ 03中,规则三,因为没有任何移动)。如果您有复制构造函数,复制赋值运算符,析构函数,移动构造函数或移动赋值运算符中的任何一个,则需要编写或阻止其他每个运算符。

第二是规则零,其中指出,对于大多数类,不写一个拷贝构造函数,拷贝赋值运算符,析构函数,构造运动或移动赋值操作符。相反,请将您的资源存储在为您处理该问题的特殊用途子对象中。

规则为零可能是你所指的。

与大多数经验法则一样,这不是一条硬性规则,但它背后有智慧。一个工作是资源管理(你可能称之为RAII类)的类可以处理问题的来龙去脉,而不用关心其余的逻辑,通常是以零开销的方式做到这一点。然后你的外部类可以免除这种担忧。由于资源寿命管理是一个不平凡的问题,将其与其他问题隔离并单独进行测试可以帮助减少错误。但是,如果您的对象旨在从多态继承,它通常需要一个虚拟析构函数。它应该也可以阻止赋值,复制构造(至少公开),移动构造,移动赋值和复制赋值,至于多态类,这些很少有意义,并且可能导致切片问题。

拥有用户定义的析构函数的另一个原因是,如果你正在编写一个范围守护类,它往往不拥有任何资源。正确地执行一个范围守卫类是棘手的(并且如果没有新的C++异常展开检测支持 - 基本上确定一个范围守护类是否可以安全抛出几乎是不可能的)。

相关问题