- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我运行下面的代码时
#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 报告:
"Linux glorp 4.5.7-202.fc23.x86_64 #1 SMPTue Jun 28 18:22:51 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux"
和 g++ --version 说
"g++ (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)"
第一个输出显示“这只是一个简单的字符串,一个”,而第二个输出显示空字符串。
我想这里正在进行某种优化,但是,在我以前的 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
Copyright (C) 2014 Free Software Foundation, Inc.
这是怎么回事?谢谢!
最佳答案
const char * twoCharStar = (simpleString + ", two").c_str();
在这一行之后,临时字符串(simpleString + ", two")
被销毁。
std::string
分配内存,c_str()
返回指向该内存的指针。在 std::string
的析构函数中,内存被释放。因此,在这一行之后,twoCharStar
指向已删除的内存。
在释放内存后使用内存是未定义的行为。
关于c++ - 为什么这被 g++ 优化掉了?至少,我认为这就是正在发生的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809802/
我正在编写一个快速的 preg_replace 来从 CSS 中删除注释。 CSS 注释通常有这样的语法: /* Development Classes*/ /* Un-comment me for
使用 MySQL,我有三个表: 项目: ID name 1 "birthday party" 2 "soccer match" 3 "wine tasting evening" 4
我是一名优秀的程序员,十分优秀!