首页 >后端开发 >C++ >为什么临时字符串对象的'c_str()”指针在其创建函数'foo()”返回后在'bar()”中有效?

为什么临时字符串对象的'c_str()”指针在其创建函数'foo()”返回后在'bar()”中有效?

Linda Hamilton
Linda Hamilton原创
2024-12-09 07:01:07390浏览

Why is the `c_str()` pointer of a temporary string object valid in `bar()` after its creating function `foo()` has returned?

foo() 和 bar() 中对象的生命周期

在 C 中,在函数调用期间创建的对象被视为临时对象。了解它们的生命周期对于确保正确的程序行为至关重要。

考虑以下代码:

std::string foo() {
  std::string out = something...;
  return out;
}

void bar( const char* ccp ) {
  // do something with the string..
}

bar( foo().c_str() );

问题:

为什么 c_str( ) foo() 返回的临时对象的指针在 bar() 函数中有效,即使在 foo() 之后完成?

答案:

根据 C 标准,一旦包含临时对象创建的完整表达式完成,临时对象就会被销毁。在这种情况下,完整的表达式是:

bar( foo().c_str() );

在 ASCII 艺术中,临时对象的生命周期如下所示:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral

临时对象是在 foo() 时创建的被调用(诞生)并在表达式执行完成(葬礼)后销毁,确保 c_str() 指针在 bar() 执行过程中保持有效。

以上是为什么临时字符串对象的'c_str()”指针在其创建函数'foo()”返回后在'bar()”中有效?的详细内容。更多信息请关注PHP中文网其他相关文章!

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