【解決方法】クラステンプレートでメモリの問題に直面する


こんにちはチーム。リスト、マップ、ベクターなどに新しい要素を挿入しながら、全体的に memcheck を分析しようとしました。 Linux の特定の PID でメモリ使用率が高くなります。 リスト オブジェクトがクリアされた後も、同じメモリ使用率が表示されます。

#include<bits/stdc++.h>
using namespace std;
#include<unistd.h>

int main()
{
   list<string> l1;

   for(int i=0;i<10000000;++i)
   {
      stringstream ss;
      ss << "000000000000000" << i << "__" << i << "00000000000000000000";
      l1.push_back(ss.str());
   }

   cout<<"Before Size : "<<l1.size()<<endl;

   sleep(5);

   l1.clear();
   cout<<"After Size : "<<l1.size()<<endl;

   getchar();

}

コンパイル: g++ Design.cpp -o Design

Linux ターミナルでメモリ使用量が多いことがわかりました:
トップ -b | grep -i 設計

19081 issue 20   0 1231.4m 1.192g   1.0m S  0.0 32.2   0:13.67 Design
19081 issue 20   0 1231.4m 1.192g   1.0m S  0.0 32.2   0:13.67 Design

私が試したこと:

マップのポインタオブジェクトを試してみましたが、それでもメモリは減りません。

解決策 2

解決策 1

何を期待していましたか?
10,000,000 個のストリームを作成し、それらすべてをリストに追加します。

list<string> l1;

for(int i=0;i<10000000;++i)
{
   stringstream ss;
   ss << "000000000000000" << i << "__" << i << "00000000000000000000";
   l1.push_back(ss.str());
}

リストを使い終わったときにリストをクリアしたとしても、ストリームはまだ存在しており、ストリームが占有していたメモリは、すべてがスコープ外になるまで、つまり関数が終了するまで解放されません。 ここを参照してください: リソースの取得は初期化 – Wikipedia[^]

コメント

タイトルとURLをコピーしました