可能重复:
const引用是否延长了临时的寿命?
我的编译器没有抱怨为const引用分配临时:
string foo() {
return string("123");
};
int main() {
const string& val = foo();
printf("%s\n", val.c_str());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么?我认为返回的字符串foo是临时的,val可以指向生命周期结束的对象.C++标准是否允许这样做并延长返回对象的生命周期?
编辑:感谢所有指出问题的人,并在Stack Overflow上进行了讨论.我自己投了最后一次投票.
一个相关的问题:在没有CPP参考ostringstream或ostringstream::str说明其暂时的.这么多人怎么知道的?或者我应该咨询不同的文件?
我有很多与在Debian 7.3(x64)的内存错误麻烦GCC 4.7.2,-std=c++11和std::ostringstream.它导致bizaare结果,如/sf/ask/1488257081/.
完整的程序使用Sqlite.从命令行运行简化案例与Valgrind打印2个不同的错误.整个简化案例程序可以在Code Viewer中找到(我认为在这里发布整个示例有点长).它所做的只是初始化Sqlite,打开数据库,创建表,关闭数据库,以及将数据库统一化.如果发生错误,它会报告错误.没有其他事情发生.
这是简化案例程序的一部分,它只是试图创建一个表.如果表存在,它应该产生错误(它会):
ostringstream qs;
qs.str().reserve(96);
qs << "CREATE TABLE test";
qs << "(";
qs << " userid INTEGER PRIMARY KEY AUTOINCREMENT,";
qs << " username TEXT,";
qs << " salt BLOB,";
qs << " hmac BLOB";
qs << ");";
const char* stmt = qs.str().c_str();
AC_ASSERT(NULL != stmt);
rc = sqlite3_exec(db, stmt, NULL, NULL, &err);
AC_ASSERT(rc == SQLITE_OK);
if(rc != SQLITE_OK) …Run Code Online (Sandbox Code Playgroud)