0

我有这个代码。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。是不是因为ris not a Record&but areference_wrapper<Record>所以我不能给Record它分配 a ?我以为reference_wrapper<Record>::operator=是超载允许这样的事情?

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

4

1 回答 1

1

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

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引用传递。此外,要坚持更换,您需要将 -loop 中的类型更改为r参考for。否则,您将分配给本地副本。

for (reference_wrapper<Record>& r : scores) { // Type changed to reference.
    /* ... */
}
于 2014-11-30T01:52:32.860 回答