在临时字符串上使用 string::c_str [重复]

Posted

技术标签:

【中文标题】在临时字符串上使用 string::c_str [重复]【英文标题】:Usage of string::c_str on temporary string [duplicate] 【发布时间】:2014-03-03 12:21:02 【问题描述】:

关于临时对象何时被销毁,这是否有效:

FILE *f = fopen (std::string ("my_path").c_str (), "r");

在评估fopen 的第一个参数之后或在fopen 调用之后,是否会立即销毁临时对象。

使用以下代码进行测试:

#include <cstdio>
using namespace std;
struct A 
        ~A()  printf ("~A\n"); 
        const char *c_str ()  return "c_str"; 
;
void foo (const char *s)  printf ("%s\n", s); 
int main () 
        foo (A().c_str());
        printf ("after\n");
        return 0;

给予:

c_str
~A
after

这表示首先评估整个语句,然后销毁任何临时对象。这种排序是标准规定的还是特定于实施的?

【问题讨论】:

【参考方案1】:

临时将在表达式的末尾被销毁,即; 分号。 所以你是安全的。

§ 12.2 ... 临时对象作为最后一步被销毁 评估(词汇上)包含的完整表达式(1.9) 它们被创建的地方。这是真的,即使那个评价 以抛出异常结束。

【讨论】:

【参考方案2】:

此顺序是标准规定的还是特定于实施的?

[class.temporary]/3

临时对象作为最后一步被销毁 在评估完整表达式 (1.9) 时(词法上)包含它们的创建点。

所以它是由标准规定的

【讨论】:

以上是关于在临时字符串上使用 string::c_str [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我仍然可以在字符串范围之外访问 std::string::c_str() 返回的 char 指针? [复制]

在 C++11 中,string::c_str() 指向的数组中的字符可以改变吗?

深拷贝 std::string::c_str() 到 char * [重复]

使用 std::string.c_str() 作为另一个方法的参数时的段错误

atoi(string.c_str()) 偶尔出现未处理的异常已更新

std::string::c_str() 覆盖函数返回的前一个