我创建了自己的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;
答案 0 :(得分:2)
第一种方法是显式创建一个本地对象作为左值(你可以获取地址),然后抛出它。
第二种方法是创建一个临时对象(一个右值)并抛出它 - 但是,抛出通常涉及复制 - 如果它不被删除或移动。
第二个可能更有效,因为它可以在没有您的干预或提示的情况下消除和/或移动。
另外,一个小的“注释” - 使用int来表示已经犯了什么错误是你可能希望避免做的事情,即使我看不出你正在做什么;试试enum!
答案 1 :(得分:0)
new()
)。 const
引用抓住它们。这些是我处理C ++异常的经验法则。
为什么第二种方式似乎也能正常工作?
您的MatrixArithmeticException
只是提供了一个int argument
的构造函数。它们的分配没有区别(来自构造函数声明),并且两个方法都会在堆栈上创建异常(除了你在考虑'创建实例'时使用new MatrixArithmeticException ()
,见我的观点1.然后)。
答案 2 :(得分:0)
你可以在C ++中抛出任何东西,尽管我们通常会抛出错误。
决定抛出一个错误,你可以直接抛出一个错误对象,或者抛出一个指向它的指针,大多数代码已经看到直接抛出错误对象。
决定直接抛出它可以在throw语句中或提前构建它。如果是一个简单的错误,我建议将它构建到位,如上面的情况所示
您的线条基本上是等效的,除了在第一个中,临时错误值在被抛出之前在逻辑上被转储到局部变量中,而在后者中它存在于未命名的临时变量中。它的不同之处在于它们的速度会有所不同,但如果它们不同,后者可能会更快。