我有一些 C++ 代码,看起来像这样
StatusMessage foo() {
...
if(errorCondition) {
return StatusMessage("some custom error message");
} else {
return StatusMessage::OK;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,虽然我知道以下内容不干净并且如果多次执行该方法会覆盖旧的 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;
}
}
Run Code Online (Sandbox Code Playgroud)
这会起作用,而且是安全的,但是StatusMessage您在此处创建的每个实例都将共享相同的字符串,因此会导致无人愿意处理的混乱代码。更好的做法是在StatusMessage构造函数中复制字符串。使用 astd::string来管理内存,它应该可以正常工作。
如果您无法更改 中的代码StatusMessage,那么您在那里获得的解决方案可能就足够了。这取决于你想做什么。另一种选择是创建某种包装类。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |