gpt4 book ai didi

c++ - 为什么这被 g++ 优化掉了?至少,我认为这就是正在发生的事情

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:36 25 4
gpt4 key购买 nike

当我运行下面的代码时

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com