std :: runtime_error会复制构造函数中传递的字符串吗?

Lor*_*one 13 c++ exception

我想知道这条线是否会创建一个悬空指针:

string arg="derp";
throw std::runtime_error("Unknown argument "+arg);
Run Code Online (Sandbox Code Playgroud)

是否std::runtime_error复制string,或者它存储的参考?

Mic*_*urr 12

std::exception(std::runtime_error继承自的)必须复制一条消息,即使它没有明确地在标准中调出(我能找到).在一般情况下,exception该类没有理由期望what()消息的来源会比它更长.

  • +1;当抛出异常时,本地范围内的所有对象都将被销毁,因此如果不进行复制,您基本上无法访问除字符串文字之外的任何内容。 (2认同)
  • @GManNickG:我没有看到任何关于它明确声明的内容,但是对于`exception :: what()`来说,面对代码,例如`string*s = new string("foobar"); runtime_error rte(*s); 删除s; cout << rte.what();`必须复制一份. (2认同)
  • 我认为,缺乏特异性是有意为的,以允许实现尽可能多的灵活性。只要达成约束,幕后发生的事情就不那么重要了。我认为要注意的重要一点是,传递给构造函数的字符串将在以后的调用中反映出来。 (2认同)