struct基类作为抛出异常对象

时间:2011-04-21 22:48:19

标签: c++ exception vtable virtual-destructor

直觉告诉我抛出的类型越简单越好。最好抛出一个int而不是一个指针,最好抛出一个结构而不是一个类。在这种情况下,虽然有必要使用动态分配的成员抛出几乎完整的类。在堆中分配内存很方便,因为缓冲区可能会变得很长并且复制成本很高;它不需要方法,因为它充当其他对象的控件/参数结构,但是在堆中构建它以抛出指向struct的指针并使用析构函数来清理内存是很方便的。越简单越好,析构函数应该是虚拟的吗?在异常传递时,省略vtable vtables不会影响会更好吗?

从此结构派生类作为基类的优点是添加更多数据,而不是多态方法。指针可能会在异常点之前被捕获几层,并在模块之间传递,因此对象应该尽可能干净,并且尽可能减少混合错误的风险。

2 个答案:

答案 0 :(得分:1)

看一下std :: exception并从中继承。

如果您希望人们将该类用作基类,则析构函数应该只是虚拟的。

答案 1 :(得分:1)

只有在通过指向基类的指针删除对象时才需要虚拟析构函数。在异常类型的情况下,您不应该动态创建它们,而是按值抛出。所以不需要通过基类指针或其他方法删除它们,因此不需要虚拟析构函数。

话虽如此,与你提到的动态分配数据相比,v-table的成本很小,并且与抛出异常的成本相比,除非经过验证,否则你应该总是偏向于效率而不是效率需要优化。我建议您从std::exception派生所有异常类型,以便您可以统一处理代码和标准库(以及其他库)引发的错误。这已经有一个虚函数(what(),返回一个消息字符串)和一个虚析构函数。