使用非文字字符串抛出out_of_range异常.什么是较小的邪恶?

Mat*_*att 2 c++ exception

我正在编写一个小型库,它可以在输入参数超出范围时执行一些可能会抛出异常的事情.看起来很简单,我会抛出一个std :: out_of_range.

我还想生成一个很好的消息,例如"你给了我X但Y是范围内的最大值" - 即我正在格式化一个字符串并希望将其用于异常.

奇怪的是构造函数的签名是

explicit out_of_range (const string& what_arg)

也就是说,它需要对字符串进行const引用.当我们弹出函数时,我在堆栈上创建的任何字符串都将被销毁,从而为异常的捕获者留下一堆垃圾.所以我只有几个选择:

  1. 使用字符串文字,因此没有很好的生成消息.它在程序的生命周期内有效.
  2. 在函数中使字符串为static,并在抛出时重写它.线程安全不是我的程序的问题,但这感觉很脏.
  3. 子类out_of_range以便它获取字符串的副本,并使用对副本的引用来调用超类构造函数,以便在异常对象的生命周期中存在该副本.

我倾向于3是最不重要的,可以说是比直接使用标准类更好的设计,但我不得不问:是否真的没有办法直接使用标准的out_of_range类生成的字符串?我错过了什么吗?

Dav*_*eas 6

该异常将保存您传入的字符串的副本,而不仅仅是引用.您可以在本地安全地创建字符串并将其传递给异常的构造函数,而不必担心生命周期问题.

请注意,字符串通过引用传递的事实不会抑制在构造函数内部复制的可能性,这似乎让您感到困惑.