c++ - 在类中使用对文字的 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 上测试
解决方案
A::zero
是一个悬空引用,因此是 UB。
构造时st
,会创建一个临时对象来传递参数。这个临时文件在语句末尾超出了范围,但st.zero
仍在引用它。因此,当您尝试使用它时,就会发生神秘的事情。
-g 和 -O2 之间的差异是巧合。使用 UB,根据具体情况可能会发生不同的事情。
推荐阅读
- xmp - 从 Lightroom 到 Darktable 的 Sidecar Xmp 不起作用
- angular - ngxs Selector 显示数据(嵌套json数据)
- bevy - Bevy 顶点彩色着色器
- python - 数组和条件检查中的值总和 - Python
- webrtc - 我可以从浏览器控制 PeerJs dataConnection 中的数据大小(如果我可以独立)
- tensorflow - 如何处理改变图像分类中标签的增强?
- mongodb - 使用结果集数组字段中的 id 从 MongoDB 检索文档的有效方法
- flutter - Flutter 中的布局:包含一个正方形和 3 行文本的行
- docker-compose - 对等方无法与超级账本结构中的订购者连接
- css - 仅当列表项超过一定数量的单词时才将边距底部添加到列表项