首页 > 解决方案 > 在类中使用对文字的 const 引用时 C++ O2 内存泄漏

问题描述

当我在实现一个程序时,我发现我的程序在从 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,例外输出(在最后一行)为零 = 0,因为变量zero是 const 引用。

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

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

实际上,它输出 的值p

这是错误还是预期行为?

在 Debian10 amd64 上测试

标签: c++optimizationmemory-leaksmachine-code

解决方案


A::zero是一个悬空引用,因此是 UB。

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

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


推荐阅读