我有一些 C++ 代码,看起来像这样

StatusMessage foo() {
  ...
  if(errorCondition) {
    return StatusMessage("some custom error message");
  } else {
    return StatusMessage::OK;
  }
}

StatusMessage 的构造函数接受一个 const char* 并存储它的指针。

但是,现在我想返回一个格式化的字符串。

我认为以下可能会导致崩溃,因为 not_ok 的内存仅在此函数的范围内有效。
StatusMessage foo() {
  ...
  if(errorCondition) {
    char not_ok[512];
    sprintf(not_ok, "some custom error message with additional detail: %d", someInt);
    return StatusMessage(not_ok);
  } else {
    return StatusMessage::OK;
  }
}

现在,虽然我知道以下内容不干净并且如果多次执行该方法会覆盖旧的 StatusMessage 值的内容,但我想知道这在内存访问方面是否通常是安全的(除非消息溢出缓冲区):
StatusMessage foo() {
  ...
  if(errorCondition) {
    static char is_this_ok[512];
    sprintf(is_this_ok, "some custom error message with additional detail: %d", someInt);
    return StatusMessage(is_this_ok);
  } else {
    return StatusMessage::OK;
  }
}

最佳答案

这行得通,而且是安全的,但是您在此处创建的每个 StatusMessage 实例都将共享相同的字符串,因此会导致无人愿意处理的困惑代码。更好的做法是复制 StatusMessage 构造函数中的字符串。使用 std::string 来管理内存,它应该可以完美地工作。

如果您无法更改 StatusMessage 中的代码,那么您在那里获得的解决方案可能就足够了。这取决于你想做什么。另一种选择是创建某种包装类。

关于c++ 返回指向函数内部定义的静态数组的指针是否有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59879411/

10-11 08:39