QList の動的メモリ
-
19-09-2019 - |
質問
私は 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
動的であり、要素が削除されるとメモリが解放されます。したがって、何かが欠けているか(非常に可能性が高い)、動的構造ではありません。それを機能させる方法はありますか?
よろしく
解決
から ドキュメント これは予期された動作であるようです。
内部配列はリストの存続期間中にのみ大きくなることに注意してください。決して縮むことはありません。内部配列は、あるリストが別のリストに割り当てられるときに、デストラクターと代入演算子によって割り当てが解除されます。
メモリの割り当てを解除したい場合は、いくつかのオプションがあります。
- デストラクターが呼び出されていることを確認します (delete を使用するか、{最初にリストを新規作成したと仮定して}、または QList オブジェクトがスコープ外になることを許可します)。
- 空のリストを大きなリストに割り当てます (これはうまくいくと思います)
他のヒント
私はこれについて読んで思い出します:
ます。http:// cplusplus- soup.com/2010/01/05/freedelete-not-returning-memory-to-os/する
メモリの割り当て/削除の動作をどうするかもしれようだが、私はその約100%わからないんだけど。
QListには、途中までの間にある QVectorする(STDする::ベクトルを類似)と< href = "http://qt.nokia.com/doc/4.6/qlinkedlist.html" のrel = "nofollowをnoreferrer"> QLinkedList の(同様のはstd ::リストします)。 QListには、オブジェクト自体へのポインタの配列を保持します。
このスキームは、リストを並べ替える/ソートする(ベクトルに類似)高速であるが、項目が追加されるポインタストアが連続的に大きくなることを意味します。したがって、リストからアイテムを削除して配列内のアイテムによって使用されるメモリではなく、ポインタを解放します。
メモリを再利用するには、新しいリストを作成する必要があります。 QVectorは(スクイーズを持っている)が、それはQListの中に存在していないようです。
QListには、<1000個のオブジェクトのリストをお勧めします。あなたは非常に大きなリストを処理するために必要とするオブジェクトが削除されているとして再利用されるメモリが必要な場合は、QLinkedListを使用することを検討すべきです。
にQListにからメモリを解放するためにこのコードを試してみてください。
while( ! memList.isEmpty() )
delete memList.takeFirst();