c++ - 我的 bad_alloc 从哪里来?

标签 c++ vector reference reference-wrapper

我有这个代码。 scoresHiscoreTable中的一个字段类型 std::vector<reference_wrapper<Record>>

void HiscoreTable::replaceRecord(Record rec)
{
  bool found = false;
  for (reference_wrapper<Record> r : scores) {
    if (r.get().name == rec.name) {
      r = rec;
      found = true;
      break;
    }
  }
  if (!found) {
    scores.push_back(rec);
  }
}

如果我尝试做 for(reference_wrapper<Record> r : scores) cout << r.get() << endl; , 一个 bad_alloc 被抛出。是不是因为r不是 Record&但是一个reference_wrapper<Record>因此我不能分配 Record到吗?我以为reference_wrapper<Record>::operator=重载允许这样的事情?

编辑:事实证明这是我的析构函数中的问题,打印循环所在的位置。在某些时候,我按值将 HiscoreTable 传递给辅助函数,当它在辅助函数结束时被破坏时,它使调用站点的 HiscoreTable 无效。我不知道为什么打印会破坏引用,但我想这就是发生的事情。

最佳答案

对于初学者来说,您正在创建对本地对象的引用。

void HiscoreTable::replaceRecord(Record rec) { // 'rec' passed by value.
    bool found = false;
    for (reference_wrapper<Record> r : scores) {
        if (r.get().name == rec.name) {
        r = rec; // Reference to local object 'rec'.

        /* ... */

} // 'rec' is destroyed and any reference to it will become dangling.

std::reference_wrapper 的赋值运算符会将内部“引用”替换为作为参数传递的引用,例如

r = rec; // Reference wrapper 'r' will contain pointer to 'rec'.

而是通过引用传递 rec。此外,为了让替换生效,您需要将 for 循环中的 r 的类型更改为引用。否则,您将分配给本地拷贝。

for (reference_wrapper<Record>& r : scores) { // Type changed to reference.
    /* ... */
}

关于c++ - 我的 bad_alloc 从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27209029/

相关文章:

c++ - 运算符在类内与类外重载

C++ 错误 : Member declaration not found

vector - 在 Rust 中,有没有办法只对容器的一部分执行 retain()?

php - 数组中的对象是否通过引用传递?

recursion - 在 Go 中使用递归引用

c++ - CreateFile 函数可以打开仅在 Global 下列出的设备的句柄吗? WinObj 实用程序中的目录?

c++ istringstream()函数将字符串转换为int引发错误

c++ - 在 C++ 中对自定义对象的 vector 进行操作

c++ - Direct3D9 游戏 : Spaceship camera

c++ - 切片 : When passing derived as reference to base, 基引用丢失数据?