在临时字符串上使用 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() 作为另一个方法的参数时的段错误