此代码似乎在一个启用优化的广泛使用的编译器上中断,尽管它在Visual中运行良好。
struct foo
{
foo(int a) { s[0] = '0'+a%10;s[1] = '\0'; }
const char * bar() const { return &s[0]; }
char s[4];
};
int main( )
{
const char * s = foo(1234).bar();
printf("%p %s\n", s, s);
}我希望即使foo是一个rvalue,它也将在堆栈上构建,并且's‘将指向有效的数据。但是,使用GCC ( 7.5和9版本)时,缓冲区永远不会初始化。
示例失败的编译行:
g++-9 --std=c++11 -Wall -pedantic -O3 -o example example.cpp发布于 2020-09-12 01:07:55
在这条线上:
const char * s = foo(1234).bar();s指向临时foo对象的char s[4]成员。在完整表达式的末尾,该对象将消失,s现在指向无效内存。在下一行上打印它将调用未定义的行为。
这里的问题是使用bar()的返回值。链式函数调用本身很好,因此,如果直接在printf中使用表达式,则定义得很好:
printf("%s\n", foo(1234).bar()); // okhttps://stackoverflow.com/questions/63855915
复制相似问题