【问题标题】:Where's my bad_alloc coming from?我的 bad_alloc 来自哪里?
【发布时间】:2014-11-30 01:22:46
【问题描述】:

我有这个代码。 scoresHiscoreTablestd::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&lt;Record&gt; r : scores) cout &lt;&lt; r.get() &lt;&lt; endl;,则会抛出一个 bad_alloc。是因为r 不是Record&amp; 而是reference_wrapper&lt;Record&gt;,因此我不能为它分配Record?我以为reference_wrapper&lt;Record&gt;::operator= 已经超载允许这样的事情发生?

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

【问题讨论】:

  • 为什么不使用调试器,对所有异常启用中断,并将堆栈回溯到代码中的原始点?总比猜测好。

标签: c++ vector reference reference-wrapper


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多