为什么要用g ++优化它?至少,我认为这是怎么回事

时间:2017-06-28 18:14:56

标签: c++

当我运行以下代码时

#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。

这里发生了什么?谢谢!

1 个答案:

答案 0 :(得分:9)

const char * twoCharStar = (simpleString + ", two").c_str();

在此行之后,临时字符串(simpleString + ", two")将被销毁。

std::string分配内存,c_str()返回指向该内存的指针。在std::string的析构函数中,内存被释放。因此,在此行之后,twoCharStar指向已删除的内存。

释放后使用内存是未定义的行为。

相关问题