최근에 나는 erase
메서드로 인한 unordered_set의 이상한 동작을 발견했습니다. 나는 아래에 최소한의 예를 제시한다.unordered_map 지우기 segfault
먼저 unordered_set을 만듭니다. 그런 다음 요소 중 하나 인 프랑스를 지 웁니다. 그런 다음 for 루프를 사용하여 모든 요소를 지 웁니다. 실행시, segfaults. 그러나 내가 지우는 프랑스 부분을 주석 처리하면 코드가 제대로 작동합니다.
이 프로그램은 g++ test.cpp --std=c++11
으로 컴파일됩니다. g ++의 버전은 4.9.1입니다.
#include <iostream>
#include <string>
#include <unordered_set>
int main()
{
std::unordered_set<std::string> myset =
{"USA","Canada","France","UK","Japan","Germany","Italy"};
// erasing by key, causing segfault later; no segfault if commented out
myset.erase ("France");
std::cout << "myset contains:";
for (const std::string& x: myset) { myset.erase(x); }
// The problem persists for a regular for loop as well.
//for ( std::unordered_set<std::string>::iterator it = myset.begin(); it!=myset.end(); it++ ) { myset.erase(it); }
std::cout << std::endl;
return 0;
}
단서가 있습니까?
감사 범위 기반 루프가 정의되지 않은 동작하는 내부 KC
답장을 보내 주셔서 감사합니다. Jonathan. 나는 range-for for 루프를 일반적인 for 루프로 대체하려고 시도했지만 문제는 여전히 지속된다. 원본 게시물을 수정하십시오. –
@ K.Chen : 귀하의 편집은 range 기반의 작업과 정확히 동일합니다. 즉, 유효하지 않은 반복기에 의존합니다. 어떻게하면이 문제를 해결할 수 있는지에 대한 답을 보여주는 예제를 추가 할 것입니다. –