6

Linux では、std::deque はプログラムが終了するまでメモリを解放しません。完全なコードは以下のとおりです。どんな助けでも大歓迎です!

#include <deque>
#include <vector>
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <queue>
#include <list>
#include <cstdio>
#include <cstdlib>

typedef  boost::shared_ptr<std::vector<int> > VecPtr;
typedef  std::deque< VecPtr  > QueueType;

 char buf[1024];
 char line[1024];

 int main()
 {

  {

    int v=0;
    QueueType  deq;
    for(int i=0; i<30;++i)
    for(int j=0; j<1000;++j)
    for(int k=0;k<1000;++k)
    {
       VecPtr p( new std::vector<int>);
       deq.push_back(p);
    }

    std::cout<<"Done with increasing deq:deq size="<<deq.size()<<std::endl;
    sleep(20);

    std::cout<<"start decreasing deq size"<<std::endl;
    while(deq.size()>0)
    {
      deq.pop_front();
    }
    std::cout<<"done with decreasing deq size,deq size="<<deq.size()<<std::endl;
  }
  std::cin.getline(line,sizeof(line));
  return 0;
}
4

2 に答える 2

19

そうです、pop_front()によって割り当てられたストレージの割り当てを解除しませんpush_back() 。プログラムが終了する前に割り当てを解除したい場合は、オブジェクトの有効期間を終了できます。オブジェクトの有効期間が終了する前に割り当てを解除したい場合は、C++ コンテナー クラスに「縮小して合わせる」イディオムを使用することを検討してください。

QueueType().swap (deq); // C++98
deq.shrink_to_fit(); // C++11
于 2011-04-29T16:36:54.493 に答える
0

std::deque からメモリを解放する方法に関する MSalters からの応答をコピーしていますか? (リンクを提供してくれた Emile Cormier に感謝)。

「std::deque はメモリをアロケータに返します。多くの場合、このアロケータは OS にメモリを返しません。そのような場合、メモリが「解放」されていないように見えます。優れたメモリ リーク検出器は、すぐに満たされます。メモリはアロケータに返され、free() によってすべてのメモリが解放されるわけではないことを理解してください。」

したがって、メモリを解放しても、実際にはメモリは解放されません。これは、プログラム内のすべての割り当てが STL によって実行されない限り、不合理な動作と見なされがちです。ライブラリのかなり自己陶酔的。そのため、制御を改善するために、メモリを集中的に使用するデータ構造のアロケータをオーバーライドすることを検討してください。他の人は、STL アロケーター システムも不足していることに気づきました。Electronic Arts の EASTL プロジェクトを参照してください。

于 2015-07-07T11:00:27.487 に答える