在C++中抛出异常的两种方法(不使用堆)
Two ways to throw exception in C++ (without using the heap)
我制作了自己的MatrixArithmeticException
,它的构造函数采用int
来指定犯了哪种类型的错误。我在代码中尝试了两种抛出异常的方法。这是两种方式:
- 创建一个
MatrixArithmeticException
的实例并抛出该实例 throw MatrixArithmeticException(0); //or whatever the int is supposed to be
无论哪种方式,代码都有效,但我的问题是,哪种方式(就空间而言)更有效?另外,为什么第二种方式看起来同样有效?
编辑:从我收到的关于这个问题的几个答案(以及对其中一个答案的评论)来看,我应该首先提供我的代码。
我从来没有以任何一种方式使用过动态记忆(我试图在问题的标题中暗示这一点,但这显然是不够的)。至于我的第一种方法的代码,我这样做了:
MatrixArithmeticException dimensionsDoNotMatch(0);
throw dimensionsDoNotMatch;
我想这个问题将是基于堆栈的C++,相当于问某人这两者之间的区别:
MatrixAritmeticException dimensionsDoNotMatch = new MatrixArithmeticException(0);
throw dimensionsDoNotMatch;
这个:
throw new MatrixArithmeticException(0);
这两个问题似乎有一个共同的答案。std::cout << "Thanks, guys!!" << std::endl;
第一种方法是显式地创建一个本地对象作为左值(可以获取其地址),然后抛出它。
第二种方法是创建一个临时对象(一个右值)并抛出它——然而,抛出通常涉及复制——如果它没有被删除或移动的话。
第二种可能更有效,因为它可以在没有你干预或提示的情况下消除和/或移动。
此外,一个小的"注意"——用int来象征犯了什么错误,这是你可能希望避免做的事情,即使我看不出你到底在做什么;请尝试枚举!
- 不要在堆上构造异常(使用
new()
) - 不要复制捕获的异常实例,请重新抛出
- 使用
const
引用捕获它们
这些是我处理C++异常的经验法则。
为什么第二种方式看起来同样有效?
您的MatrixArithmeticException
只是提供了一个采用int argument
的构造函数。它们的分配(来自构造函数声明)没有区别,并且这两个方法都会在堆栈上创建异常(此外,在说"创建实例"时,您已经考虑过使用new MatrixArithmeticException ()
,请参阅我的观点1。然后)。
您可以在C++中抛出几乎任何东西,尽管我们通常会抛出错误。
在决定抛出错误后,您可以直接抛出错误对象,或者抛出指向它的指针,尽管大多数代码都看到过直接抛出该错误对象。
决定直接抛出后,您可以在抛出语句中构造它,也可以提前构造它。如果这是一个简单的错误,我建议将其构建到位,就像上面的情况一样
行基本上是等价的,只是在第一行中,临时错误值在抛出之前在逻辑上转储在本地变量中,而在后面的行中,它驻留在一个未命名的临时变量中。与之不同的是,它们的速度会有所不同,但如果它们这样做了,那么后者可能会更快。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法