我有一些 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/