作为抛出异常对象的结构基类



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

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

查看std::exception并继承它

析构函数只有在期望人们将该类用作基类时才应该是虚的。

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

话虽如此,与您提到的动态分配数据相比,与抛出异常的成本相比,v表的成本很小,并且您应该始终优先考虑效用而不是效率,除非有证明需要优化。我建议您从std::exception派生所有异常类型,以便您可以以统一的方式处理代码和标准库(以及其他库)抛出的错误。它已经有一个虚函数(what(),返回一个消息字符串)和一个虚析构函数。

最新更新