2017-10-19 13 views
0

Qt Qlist 컨테이너에 흥미로운 문제가 있습니다. QList에 QList를 추가하려고하면 내 반복자가 메모리의 알 수없는 부분을 가리 키도록 만듭니다.QList를 QList에 추가하기 <QList>

QList<int> listSmall; 
QList<QList<int>> listBig; 

for(int i = 0; i < 3; ++i) 
    listSmall.append(i); 

for(auto it = listSmall.begin(); it != listSmall.end(); ++it) 
    listBig.append(listSmall); 

조건 it != listSmall.end(); 큰 목록에 작은 목록을 추가하면 항상 true입니다. 왜 이런 일이 발생합니까?

P. STL 목록은 잘 작동합니다.

+0

나는 QT에 대한 아이디어를 가지고 있지만이 링크를 확인하고 U가 유용 https://stackoverflow.com/questions/41438428/qlist-iteration-using-conditions –

+0

@를 찾아 낼 수있는 경우에 표시되지 않습니다 Tharushi Geethma는 불행히도이 질문은 stl algorthms을 사용하는 것이 좋겠지 만 QList에 추가하는 것이 잘못된 것이라고 말하지 않습니다. – Ivan

+0

당신이 그것을 추가하고 싶다면'listBig.append (listSmall);을 한번하면됩니다! – xander

답변

3

이것은 stl-like 반복자와 함께 사용할 때 Qt 컨테이너의 알려진 제한 사항입니다. documentation에서 설명합니다.

암시 적 공유는 STL 스타일 반복기에 또 다른 결과를 가져옵니다. 반복기가 해당 컨테이너에서 활성화되어있는 동안 컨테이너를 복사하지 마십시오. 반복기는 내부 구조를 가리키며, 컨테이너를 복사하면 반복자에 매우주의해야합니다.

표준 목록을 사용하거나 다르게 반복하는 것과 같이 수행하려는 다른 방법을 찾아야합니다.

0

TLDR : 값을 변경하지 않을 경우 cbegin()cend()을 사용하십시오.

세부 사항 :

  • 컴파일러는 const가 아닌 begin()하고 부탁대로 end() 버전을 호출; const ref/pointer를 통해 cbegin() 또는 begin() 을 호출하면 const 버전을 사용할 수 있습니다.
  • QList는 사용자가 listBig.append(listSmall); 일 때 copy-on-write 및 공유 메모리를 대신 사용하려고 시도합니다. const가 아닌 내부 다음 반복에서
  • end() (등이 listBig 콘텐츠 이미 의해 참조) 로컬 데이터 보다 한번 참조되는 것을 확인한 후에 데이터를 복사 detach() 문안있다.

이 모두가 copy-on-write가 올바르게 구현하기 어려운 이유의 좋은 예입니다.

BugReport with answer