[C ++ O2使用const引用类中的文字时发生内存泄漏

问题描述 投票:2回答:1

[我在执行程序时,发现在g ++或clang ++中从-g切换到-O2时,程序的行为有所不同。

简化代码是:

#include <cstdint>
#include <iostream>
class A {
 public:
  explicit A(const int64_t &zero_);
  const int64_t& zero;
};
A::A(const int64_t &zero_):
  zero(zero_) {
  std::cout << "zero=" << zero << std::endl;
}
int main() {
  A st(0);
  size_t p;
  std::cin >> p;
  std::cout << "zero=" << st.zero << std::endl;
}

假定标准输入为1,并且由于变量zero是const引用,所以例外输出(在最后一行)为零= 0。

g++ -g -o b.o b.cc编译时,程序运行正常。

但是,当使用g++ -O2 -o b.o b.cc编译时,输出为zero=1

实际上,它输出p的值。

这是错误还是预期的行为?

在Debian10 amd64上测试

c++ optimization memory-leaks machine-code
1个回答
5
投票

[A::zero是悬挂的参考,因此是UB。

构造st时,将创建一个临时变量来传递参数。该临时变量在语句末尾超出范围,但st.zero仍在引用它。因此,当您尝试使用它时,就会发生神秘的事情。

-g和-O2之间的差异是巧合。使用UB,根据实际情况,可能会发生不同的事情。

© www.soinside.com 2019 - 2024. All rights reserved.