3

私は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と上昇しますが、2番目のループ内でそれらを削除した後、メモリ使用量は同じレベルに留まります。QListこれは動的であり、要素が削除されるとメモリが解放されると思いました。したがって、何かが欠落しているか(非常に可能性が高い)、動的構造ではありません。それを機能させる方法について何かアイデアはありますか?

よろしく

4

5 に答える 5

4

ドキュメントから、これは予想される動作であるように見えます:

内部配列は、リストの存続期間中にのみ大きくなることに注意してください。縮むことはありません。内部配列は、あるリストが別のリストに代入されるときに、デストラクタと代入演算子によって割り当て解除されます。

メモリの割り当てを解除したい場合は、いくつかのオプションがあります

  1. デストラクタが呼び出されていることを確認します (delete {最初にリストを新規作成したと仮定して} を使用するか、QList オブジェクトがスコープ外に出るようにします)。
  2. 空のリストを大きなリストに割り当てます (これでうまくいくと思います)
于 2010-02-09T16:31:02.347 に答える
1

これについて読んだことを思い出します:

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

メモリの割り当て/削除の動作に関係しているようですが、それについては 100% 確信が持てません。

于 2010-02-09T16:28:02.867 に答える
0

QList は、QVector (std::vector に類似) とQLinkedList (std::list に類似) の中間にあります。QList は、オブジェクト自体へのポインターの配列を保持します。

このスキームは、リストの並べ替え/並べ替えが高速であることを意味しますが、アイテムが追加されるとポインターストアが継続的に拡大します (ベクターと同様)。したがって、リストからアイテムを削除すると、アイテムが使用していたメモリが解放されますが、配列内のポインターは解放されません。

メモリを再利用するには、新しいリストを作成する必要があります。QVectorにはsqueeze()がありますが、QListにはないようです。

于 2010-02-09T16:33:15.917 に答える
-1

QList は、1000 個未満のオブジェクトのリストに推奨されます。非常に大きなリストを処理する必要があり、オブジェクトが削除されたときにメモリを再利用する必要がある場合は、QLinkedList の使用を検討する必要があります。

于 2010-07-02T04:59:37.917 に答える
-2

このコードを試して、QList からメモリを解放してください

while( ! memList.isEmpty() )
    delete memList.takeFirst();
于 2011-09-15T04:16:50.750 に答える