【问题标题】:Is it safe to use c_str() as a parameter in std::exception? [duplicate]在 std::exception 中使用 c_str() 作为参数是否安全? [复制]
【发布时间】:2022-09-22 23:24:09
【问题描述】:

在构造std::exception 时将c_str() 作为参数传递是否安全?如果处理这样的异常是一个坏主意,请告诉我。在我的项目中,所有错误消息都作为std::string 从函数返回,然后作为std::exception 抛出。

#include <iostream>

int main()
{
    try {
        std::string message=\"! Something went wrong.\";
        throw std::exception(message.c_str());
    }
    catch (std::exception ex) {
        std::cerr << ex.what() << std::endl;
    }
}
  • 不,不是,而且我很确定这个问题之前已经回答过了。
  • 在您的问题中,您可能想用几句话解释为什么您担心这可能是一个坏主意。
  • 撇开悬空指针不谈,std::exception 没有带参数的构造函数,除了它的复制构造函数。

标签: c++ exception


【解决方案1】:

std::exception 没有采用const char*(或std::string)的构造函数。

std::runtime_error(和后代)两者都有构造函数。是的,将message.c_str() 指针传递给此构造函数是非常安全的(好吧,前提是内存不低)。字符数据会被复制到异常自身的内存中,允许message在异常抛出后被销毁。

如果您想使用自定义字符串消息抛出std::exception,则必须从中派生一个类并实现您自己的字符串管理以供what() 使用。在这种情况下,您必须小心不要从what() 返回无效的const char* 指针。 std::runtime_error 会为您处理,因此请从中派生。

【讨论】:

  • ...并且因为它有一个构造函数采用 const char* 传递 message.c_str() 是错误的。
  • 万无一失? message 将被销毁,从 c_str 返回的指针将悬空
  • @463035818_is_not_a_number 你在这两个方面都错了。 std::runtime_error 不会按原样存储传递的 char* 指针。它制作数据的副本。
  • 嗯,是的,如果构造函数不复制字符串会很奇怪;)
猜你喜欢
  • 2013-08-11
  • 2011-05-05
  • 2023-01-11
  • 2015-03-28
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多