我发现了vector漏洞(?)
  • 板块学术版
  • 楼主maka_baka
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/8/18 07:27
  • 上次更新2024/8/18 11:14:45
查看原帖
我发现了vector漏洞(?)
477758
maka_baka楼主2024/8/18 07:27

大家好呀。

我们知道,vector 的 push_back 向末尾添加一个数。可是这个操作竟然会改变前面元素的值?实验代码如下。

#include <iostream>
#include <vector>
#include <string>

using String = std::string;

struct Type {
  String name;
  Type(String name): name(name) {}
};

std::vector<Type> types;

int main() {
  using namespace std;
  types.push_back({"@"});
  Type &global = types[0];

  // 用 cerr 无阻塞输出
  cerr << global.name << '\n';
  types.push_back({"byte"});
  // 为什么会这样呢
  cerr << global.name.length() << '\n';
  // Runtime Error
  cerr << global.name[0] << '\n';
}

在 Linux 上,gcc 版本 14.2.1 20240805 (GCC) 时运行这段代码 (洛谷 IDE 也有类似的结果):

@
13422348455664032349
段错误(核心已转储)

一种可能是在第二次 push_back 时,添加的元素把旧的 string 覆盖了?(求解答)

也欢迎大家在自己的 Windows 电脑上测一下这段代码的输出。

2024/8/18 07:27
加载中...