为什么在返回字符串的函数上调用 std::string.c_str() 可能会导致问题
处理字符串时C、了解临时对象的生命周期至关重要。在按值返回字符串的函数的返回值上调用 std::string.c_str() 时,会出现一个常见的误解。
在以下代码片段中:
<code class="cpp">std::string getString() { std::string str("hello"); return str; } int main() { const char* cStr = getString().c_str(); std::cout << cStr << std::endl; }</code>
一可能期望函数 getString() 将返回存储在函数作用域内的字符串 str 的副本,从而允许 cStr 保存对其的有效引用。
但是,情况并非如此。在 C 中,函数调用的返回值是一个临时对象。当临时对象绑定到引用或用于初始化命名对象时,其生命周期会延长。否则,它会在创建它的完整表达式末尾被销毁。
在上面的代码中,getString()的返回值是一个std::string类型的临时对象,它被返回按价值。由于 cStr 不绑定到引用或初始化命名对象,因此在计算表达式 getString() 后,临时 std::string 对象将被销毁。这意味着 cStr 现在指向已释放的内存,使其使用不安全。
要避免此问题,请考虑通过将临时对象复制到命名对象或将其绑定到引用来延长临时对象的生命周期,例如:
<code class="cpp">std::string str = getString(); const char* cStr = str.c_str();</code>
或:
<code class="cpp">const std::string& ref = getString(); const char* cStr = ref.c_str();</code>
或者,您可以立即使用 c_str() 返回的指针,而不将其存储在变量中:
<code class="cpp">std::cout << getString().c_str() << std::endl;</code>
以上是为什么在按值返回字符串的函数上调用'std::string.c_str()”会导致问题?的详细内容。更多信息请关注PHP中文网其他相关文章!