수색…


비고

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의 단순화 된 모델입니다. 내부에는 실제 문자열 데이터와 참조 카운터가있는 메모리 블록이 있습니다.

QString s2 = s1;

QString 복사

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