수색…
비고
Qt 컨테이너의 STL 스타일 반복자는 암시 적 공유로 인해 부작용이 발생할 수 있습니다. 반복자를 활성화 한 상태에서 Qt 컨테이너를 복사하지 않는 것이 좋습니다.
QVector<int> a,b; //2 vectors
a.resize(1000);
b = a; // b and a now point to the same memory internally
auto iter = a.begin(); //iter also points to the same memory a and b do
a[4] = 1; //a creates a new copy and points to different memory.
//Warning 1: b and iter point sill to the same even if iter was "a.begin()"
b.clear(); //delete b-memory
//Warning 2: iter only holds a pointer to the memory but does not increase ref-count.
// so now the memory iter points to is invalid. UB!
기본 사상
여러 Qt 객체와 컨테이너는 개념을 사용하여 암시 적 공유를 호출합니다.이 개념은 쓰기 중 복사 (copy-on-write) 라고도합니다.
암시 적 공유는이 개념을 사용하는 클래스가 초기화시 동일한 데이터를 공유 함을 의미합니다.
개념을 사용하는 이들 클래스 중 하나는 QString입니다.
QString s1("Hello World");
이것은 QString의 단순화 된 모델입니다. 내부에는 실제 문자열 데이터와 참조 카운터가있는 메모리 블록이 있습니다.
QString s2 = s1;
이 QString
복사하면 두 객체 모두 내부적으로 동일한 내용을 가리키고 불필요한 복사 작업을 피할 수 있습니다. 참조 횟수도 어떻게 올랐는지 유의하십시오. 따라서 첫 번째 문자열이 삭제되면 공유 데이터는 다른 QString
의해 참조된다는 것을 여전히 알고 있습니다.
s2 += " and all the other Worlds!"
이제 QString
이 실제로 수정되면 객체는 메모리 블록에서 "분리"되고 내용을 복사하고 내용을 수정합니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow