문제

나는 QT에 대한 경험이 많지 않으며이 문제는 오늘 나왔습니다.

QList<int> memList;
const int large = 100000;

getchar();
for (int i=0; i<large; i++)
{
    memList.append(i);
}

cout << memList.size() << endl;
getchar();

for (int i=0; i<large; i++)
{
    memList.removeLast();
}

cout << memList.size() << endl;
getchar();

메모리 사용량을 확인할 때 첫 번째 루프 후 새로운 요소가 추가로 증가합니다. memList 그러나 두 번째 루프 내에서 제거한 후 메모리 사용량은 같은 수준에 있습니다. 나는 그렇게 생각했다 QList 역동적이었고 요소가 제거되면 메모리를 자유롭게 할 것입니다. 그래서 나는 무언가를 놓치거나 (매우 가능성이 높은) 역동적 인 구조가 아닙니다. 작동하는 방법이 있습니까?

문안 인사

도움이 되었습니까?

해결책

로부터 문서 이것이 예상되는 행동 인 것 같습니다.

내부 배열은 목록의 수명 동안 만 커집니다. 결코 축소되지 않습니다. 내부 배열은 한 목록이 다른 목록에 할당 될 때 파괴자와 할당 연산자가 처리합니다.

메모리를 탈신하려면 몇 가지 옵션이 있습니다.

  1. 소멸자가 호출되어 있는지 확인하십시오 (Delete 사용 {처음에 목록을 작성했다고 가정하거나 Qlist 객체가 범위를 벗어나도록 허용)
  2. 빅 목록에 빈 목록을 할당하십시오 (이것이 작동한다고 생각하십시오)

다른 팁

나는 이것에 대해 읽는 것을 기억한다 :

http://cplusplus-soup.com/2010/01/05/freedelete-not-returning-memory-to-os/

메모리 할당/삭제 동작과 관련이 있을지 모르지만 100% 확실하지 않습니다.

QList는 사이의 부분입니다 QVECTOR (std :: 벡터와 유사) 및 QlinkedList (std :: 목록과 유사). QList는 객체 자체에 다양한 포인터를 보유합니다.

이 체계는 목록에 정렬/재정렬이 빠르지 않지만 항목이 추가됨에 따라 포인터 스토어가 지속적으로 증가 함을 의미합니다 (벡터와 유사). 따라서 목록에서 항목을 제거하면 항목이 사용하는 메모리가 해제되지만 배열의 포인터는 없습니다.

메모리를 되 찾으려면 새 목록을 작성해야합니다. QVector는 squeeze ()가 있지만 QList에는 존재하지 않는 것 같습니다.

QList는 <1000 객체 목록에 권장됩니다. 객체가 삭제 될 때 매우 큰 목록을 처리해야하고 메모리를 되 찾으려면 QlinkedList 사용을 고려해야합니다.

이 코드를 시도하여 QList에서 메모리를 자유롭게하십시오

while( ! memList.isEmpty() )
    delete memList.takeFirst();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top