C++ 在名称空间实现中抛出catch

C++ 在名称空间实现中抛出catch,c++,namespaces,try-catch,division,throw,C++,Namespaces,Try Catch,Division,Throw,删除问题:迟钝。对于这种迟钝的提问,给出的答案过于尖锐或不恰当 < P> C++中使用异常的黄金法则是“按值抛出,由引用引用捕获”。 在商()中,当你说 throw new string("divide by zero!"); 您正在堆上创建一个新字符串,如果发生异常,该字符串将永远不会被释放。相反,你应该说 throw string("divide by zero!"); 它将堆栈分配一个新字符串 稍后,在catch块中,您应该通过const引用进行catch,即 catch (const

删除问题:迟钝。对于这种迟钝的提问,给出的答案过于尖锐或不恰当

< P> C++中使用异常的黄金法则是“按值抛出,由引用引用捕获”。 在商()中,当你说

throw new string("divide by zero!");
您正在堆上创建一个新字符串,如果发生异常,该字符串将永远不会被释放。相反,你应该说

throw string("divide by zero!");
它将堆栈分配一个新字符串

稍后,在catch块中,您应该通过const引用进行catch,即

catch (const string& str) {
    // ...
}
原因主要是技术上的:常量引用可以绑定到右值,而可变引用则不能,按值捕获可能需要字符串的副本


或者从另一个角度来看:异常的目的是传达失败的原因。该原因在发生后不会改变,因此创建后应将异常视为
const

供将来在stackoverflow.com上发布问题时参考:1。正确格式化代码。2.排除不相关的东西。我听从了你的建议,程序崩溃了,我想抛出的异常也没有发生。