0

私はこのコードを持っています。タイプ scoresのフィールドですHiscoreTablestd::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が aではなく aRecord&であるためreference_wrapper<Record>、a を割り当てることができないためRecordですか? そんなこと許してやり過ぎだと思っ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、参照渡しを行います。また、置換を貼り付けるには、ループ内の のタイプを参照になるように変更する必要がありrますfor。それ以外の場合は、ローカル コピーに割り当てています。

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