当我运行以下代码时
#include <iostream>
int main(int argc, char *argv []) {
std::string simpleString("this is just a simple string");
std::cout << "simpleString = " << simpleString << std::endl << std::endl;
std::string one = (simpleString + ", one");
const char * oneCharStar = one.c_str();
std::cout << "simpleString + one: '" << oneCharStar << "'" << std::endl;
const char * twoCharStar = (simpleString + ", two").c_str();
std::cout << "simpleString + two: '" << twoCharStar << "'" << std::endl;
return 0;
}
在我的Fedora Core 23机器上,uname -a报告:
&#34; Linux glorp 4.5.7-202.fc23.x86_64#1 SMP Tue Jun 28 18:22:51 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux&#34;
和g ++ --version说
&#34; g ++(GCC)5.3.1 20160406(Red Hat 5.3.1-6)&#34;
第一个输出读取&#34;这只是一个简单的字符串,一个&#34;,而第二个输出显示空字符串。
我想这里有一些优化,但是,在我之前的Ubuntu机器上(16.mumble,安静地休息),这段代码按照我的预期运行。我刚刚发现当我在新机器上重新编译我的应用程序(使用相同的make文件等)时,此代码如上所述失败。
此外,它也适用于我在以下平台上的期望:
$ uname -a Linux t4240rdb
3.12.37-rt51 + g43cecda#2 SMP Fri Mar 4 18:18:03 EST 2016 ppc64 GNU / Linux
$ g ++ --version
g ++(GCC)4.9.2
版权所有(C)2014 Free Software Foundation,Inc。
这里发生了什么?谢谢!
答案 0 :(得分:9)
const char * twoCharStar = (simpleString + ", two").c_str();
在此行之后,临时字符串(simpleString + ", two")
将被销毁。
std::string
分配内存,c_str()
返回指向该内存的指针。在std::string
的析构函数中,内存被释放。因此,在此行之后,twoCharStar
指向已删除的内存。
释放后使用内存是未定义的行为。