2011-09-08 4 views
0

Qt (C++)로 작성한 응용 프로그램에서 메모리 누수가 발생했습니다. 그리고 문제는 그 라인에 있다고 생각합니다.QVector :: replace()는 딥 카피를 생성합니까?

for(int i=0; i<DATA_LENGTH;i++){ 
     cdata1->replace(i,data->at(i));  
} 

cdata1 QVector는이 데이터가 QList이다.

내가 replace()를 사용하는 이유는 데이터의 길이가 일정하기 때문입니다. 그리고 매번 QVector를 만들고 싶지 않았습니다. QVector는 라인 객체 생성자에서 초기화 :

cdata1 = new QVector<double>(DATA_LENGTH,0); 

Qt는 문서는 const가 아닌 연산자를 사용하는 QVector 깊은 사본을 할 원인이 될 수 있음을

주를 말한다.

replace() 함수는 deep copy를 발생 시키거나 어떻게 이해할 수 있습니까?

+0

'데이터'에는 무엇이 들어 있습니까? –

+0

데이터는 다음과 같이 초기화 도구에서 초기화됩니다. data = new QList (); 그리고 두 배로 채워져 있습니다. data.append(); – HeyYO

+0

여기에 누출이 보이지 않습니다. 이중 값을 값으로 복사하면 누수가 없습니다. –

답변

2

딥 복사는 요소가 아닌 전체 컨테이너를 의미합니다. 당신이 인용 한 문장 바로 뒤에 링크되어 있으므로, QVector는 implicit sharing을 사용하는데, copy-on-write라고도합니다. 읽기 전용 내부는 공유로 복사 중 하나가 수정 될 때까지 용기의 사본, 저렴 왜 힙에 컨테이너를 만드는 이유이기도

QVector<A> vec1; 
... 
QVector<A> vec2 = vec1; //cheap, only copies a pointer internally. vec1 and vec2 
int siz2 = vec2.size(); //cheap, doesn't modify vec2, vec1 and vec2 are still the same object, internally 
vec2[0] = something; //potentially expensive: modifies vec2, thus vec2 "detaches" from vec1, getting its own copy of vec1's internal data, which is then modified by the assignment. 

거의 오히려 터무니없는 (그리고 unidiomatic)입니다 모든 경우와 스택에 대신 만들어야합니다.

0

예, 이중 값을 복사합니다. 하지만 double 값은 new으로 생성하지 않으면 메모리 누수가 발생할 수 있다고 생각하지 않습니까?

어쨌든, 당신의 주변 코드에 따라 당신은 어쩌면 추가 힌트로

을 (http://doc.qt.nokia.com/latest/qlist.html#toVector 참조)

cdata1 = data->toVector(); 

를 사용하여 해당 전체 블록을 교체 할 수 있습니다, 당신은 cdata1보다 더 많은 읽을 수있는 변수 이름을 사용하기 시작한다 또는 data. 변수에는 저장 대상을 설명해야합니다 (예 : 온도 데이터 포인트를 저장하는리스트가 있다면, 그것은 temperatureDataPoints 또는 temperatureDataPointList와 같은 것으로 불려야합니다. 당연히 "데이터"보다 더 많은 타이핑이 필요하지만 1 년 내에 코드를 보면 더 읽기 쉬운 이름을 사용하여 후회하지 않을 것입니다.

+0

글쎄 실제로 여기에 쓰는 동안 이름을 단순화하려고 시도했습니다. 그리고 난 단지 * * data **. 그래서 ** toVector() **. – HeyYO

+0

Hm을 사용하면리스트의 첫 번째 DATA_LENGTH 엘리먼트를 검색하기 위해'data-> mid (0, DATA_LENGTH)'를 사용할 수있다. 그래도 그래야한다면 벡터. –

+0

오, 고마워! 이름 때문에 그걸 놓친 것 같아. "복사/조각 등"과 같은 것을 찾고 있었어. – HeyYO