问题已删除:钝。给出的答案过于尖锐或者没有当场点击这种迟钝的质疑。
答案 0 :(得分:0)
在C ++中使用异常时的黄金法则是“按值抛出,通过const引用捕获”。
在quotient()
中,当您说
throw new string("divide by zero!");
你正在堆上创建一个新的字符串,如果发生异常,它永远不会被释放。相反,你应该说
throw string("divide by zero!");
将堆叠 - 分配新的字符串。
稍后,当你在catch块中时,你应该通过const引用来捕获,即
catch (const string& str) {
// ...
}
其原因主要是技术性的:const引用可以绑定到rvalue而可变引用不能绑定,并且按值捕获可能需要字符串的副本。
或许或者以另一种方式看待它:例外的目的是传达某些事情失败的原因。这个原因一旦发生就不会改变,所以在创建之后应该将异常视为const
。