【发布时间】:2021-12-18 20:49:26
【问题描述】:
我有以下功能:
MyFunction(const char *value, bool trigger) {
if (trigger) {
std::string temporaryString = getTemporaryStringFromSomewhereElse();
value = temporaryString.c_str();
}
// do processing here
// I need `value` and `temporaryString.c_str();` to be alive and accessible here and not destroyed
MyClass *object = new MyClass(value);
object->Work();
// etc..
}
那么,问题是,如何在if 子句的范围之外“延长”temporaryString 的生命周期?
目前,我收到以下错误:
使用指向超出范围的局部变量“临时”的指针。
我知道这与内存管理有关,并且temporary 在if 子句之后被假定为“销毁”或从内存中清除。但我需要延长它的生命周期,或者创建另一个字符串(副本),它具有不同的、更广泛的范围。
我怎样才能做到这一点?
要求:
- 函数签名不能改变,它应该保持:
MyFunction(const char *value, bool trigger) - 我稍后使用
value来初始化另一个对象,做一些其他的工作。我不能有 2 个变量,例如value和anotherValueToBeUsedIfTriggerIsTrue。
【问题讨论】:
-
为什么不简单地在块之前定义你的字符串并在块内设置值?
-
是否有一个选项可以完全摆脱
temporaryString并直接分配给vaule? -
如果您需要“在块内设置”的信息,您也可以使用
std::optional。在我看来,这是最易读的代码 -
这听起来很有趣,您能否修改我的示例以展示如何使用它?在实践中,我只需要将值设置为一个新值,就是这样。当然,它应该可以在区块之外访问。
-
看看我回答的变化...
标签: c++ memory memory-management scope stdstring