首页 >后端开发 >C++ >为什么临时字符串在创建它的函数返回后仍然有效?

为什么临时字符串在创建它的函数返回后仍然有效?

Patricia Arquette
Patricia Arquette原创
2024-12-14 16:31:11109浏览

Why Does a Temporary String Remain Valid After the Function That Created It Returns?

重新访问临时对象的生命周期

原始问题中提供的代码片段演示了一种看似矛盾的行为,其中 foo() 返回的临时字符串即使在进入 bar() 时据称已被销毁,它仍然有效。

与假设,当创建临时对象的函数完成时,临时对象并未完全销毁。相反,它的生命周期会延长,直到包含临时值的整个表达式被完全求值。

为了说明这个概念,让我们将代码分解为其组件:

  • 临时输出是在 foo() 函数中创建。
  • 表达式 foo().c_str() 然后访问 out 的 c_str() 成员并返回一个临时值const char* 指针。

根据 C 语言规则,由 foo().c_str() 生成的 const char* 临时值将持续存在,直到完整表达式 bar(foo().c_str() ) 已完全评估。这意味着即使在 foo() 执行完成后,指针仍然有效。

要可视化此行为,请想象以下时间线:

|--------------------|-----------|-----------|-----------|
|                    | birth    | funeral    |           |
|                    |  ^^^    |  ^^^^     |           |
|--------------------|           |           |           |
|                     | bar()     |           |           |
|                     |           |           |           |
|--------------------|           |           |           |
|                     |           |           |  evaluated |
|                     |           |           |  bar()     |
|--------------------|           |           |           |
|                     |           | foo()      |           |
|                     |           |           |           |
|--------------------|           |           |           |

临时对象(字符串 out和 const char* 指针)是在计算表达式 foo().c_str() 时创建的,并且它们将持续存在,直到整个表达式 bar(foo().c_str()) 计算完毕。这确保了当函数尝试访问字符串时,提供给 bar() 的指针仍然有效。

因此,可以正确地假设 foo() 返回的临时值将在调用后被销毁bar() 完成,因为这标志着包含临时变量的完整表达式的结束。

以上是为什么临时字符串在创建它的函数返回后仍然有效?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn