2014-11-30 2 views
0

이 코드가 있습니다. scores 유형 std::vector<reference_wrapper<Record>>내 bad_alloc은 어디에서 오는거야?

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); 
    } 
} 

HiscoreTable의 필드 내가 for(reference_wrapper<Record> r : scores) cout << r.get() << endl;을 수행하려고 할 경우 bad_alloc 뿐이다가 발생합니다. 그 이유는 rRecord&이 아니고 reference_wrapper<Record>이 아니기 때문에 Record을 할당 할 수 없기 때문입니까? 나는 그런 것을 허용하기 위해 reference_wrapper<Record>::operator=이 과부하 된 줄 알았습니까?

EDIT : 인쇄 루프가있는 소멸자의 문제였습니다. 어떤 시점에서 HiscoreTable을 값으로 도우미 함수에 전달했으며 도우미 함수가 끝날 때 destructed가되면 callsite의 HiscoreTable을 무효화했습니다. 왜 인쇄가 레퍼런스를 깨뜨릴 지 모르겠지만, 그런 일이 일어난 것 같아요.

+5

왜 디버거를 사용하고 모든 예외에서 브레이크를 사용하며 코드에서 출발 점으로 스택을 백 트레이스하지 않습니까? 추측하는 것보다 낫지. –

답변

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을 참조로 전달하십시오. 또한 스틱을 교체하려면 for -loop의 r 유형을 참조로 변경해야합니다. 그렇지 않으면 로컬 사본에 지정합니다.

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