为什么在返回字符串的函数上调用 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; // Outputs garbage }</code>
直观上,人们会期望从 getString() 返回的临时字符串在 main() 的范围内保持有效。然而,这是不正确的。
问题在于 C 中临时对象的生命周期。临时对象在创建它的表达式结束时被销毁,除非它绑定到引用或用于初始化命名对象。在这种情况下,getString() 返回一个临时字符串,该字符串在 main() 中的表达式末尾被销毁。
因此,cStr 持有一个悬空指针,使用它可能会导致未定义的行为。为了避免这一问题,可以使用命名变量或引用来确保返回字符串的有效性。例如:
<code class="cpp">std::string returnedString = getString(); const char* cStr = returnedString.c_str(); std::cout << cStr << std::endl; // Safe</code>
或者,可以直接使用临时字符串而不将其分配给变量:
<code class="cpp">std::cout << getString().c_str() << std::endl; // Also safe</code>
以上是以下是一些适合问答格式并准确描述文章内容的标题选项: **选项 1(短线和直接):** * **为什么在 Re 上调用 `std::string.c_str()`的详细内容。更多信息请关注PHP中文网其他相关文章!