相关疑难解决方法(0)

返回临时对象并绑定到const引用

可能重复:
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++标准是否允许这样做并延长返回对象的生命周期?

c++ const reference

61
推荐指数
1
解决办法
2万
查看次数

std:ostringstream和-std = c ++ 11的内存错误?

编辑:感谢所有指出问题的人,并在Stack Overflow上进行了讨论.我自己投了最后一次投票.

一个相关的问题:在没有CPP参考ostringstreamostringstream::str说明其暂时的.这么多人怎么知道的?或者我应该咨询不同的文件?


我有很多与在Debian 7.3(x64)的内存错误麻烦GCC 4.7.2,-std=c++11std::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)

c++ memory-leaks stringstream temporary-objects c++11

1
推荐指数
2
解决办法
3351
查看次数