stlを局所変数としてのメモリ問題


C/Cコード




Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





void func()

{

  map<int,int>m;

  for(int i=0;i<0xffffff;i  )

    m.insert(make_pair(i,i));

}



以上の関数の中で、mは局所変数ですが、func関数が戻ってきた時にはメモリを解放していません。pairのメモリはヒープに割り当てられていますが、どうやって書いたら関数を終了する時に自動的にメモリを解放できますか?によると?windows资源治理器を见ていますが、関数が出てきた时にメモリが同じコードを减らしていないことが分かりました。mapをvectorに両替したら、この问题がないです。pairのメモリはスタックに割り当てられています。明らかに違います。スタックの中に存在しています。関数のスコープを脱退して、自動的にネットユーザーを解放します。上で言った問題はどういうことですか?資源ガバナンスで見て、シングルステップで実行した状態で、確かに関数が戻ったらメモリは減少しません。vectorを使って呼び出し前のメモリのデバッグ手段に戻ります。まだよく分かりません。vs 2005の下のネット友達の返答:自動的に釈放することができるようにしましょう!ないでしょう。私のマシンでは明らかです。そして、0 xffffを使わないでください。4つのfで十分です。あなたがワンステップでトレースした時間は、関数の括弧を閉じたときに、その「位置」は、デモスタットの前の実行点です。この時にメモリを観察して、関数から飛び出してからメモリを観察してください。違いがあります。mapは分析する時自分で割り当てたメモリを釈放します。なぜなら、あなたが使うのはstl portで、stlportで使うmemory poolがメモリを割り当てているからです。だから、mapが放出するメモリはシステムに入っていないで、stlのmemory portによって管理されています。メモリは本当にリリースされていませんが、メモリが失われることはありません。stlportとは何ですか?土ではないですか?へへ。Polaristleeというのは正しいようです。上の関数を何度も呼んでみましたが、後何回もプログラムのメモリを追加していませんでした。しかし、mapから放出されたメモリは次のように利用できないという問題も発見されました。
C/Cコード




Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





#include <vector>

#include <map>

using namespace std;

void func2()

{

    vector<double>v;

    for(int i=0;i<0x7ffff;i  )

        v.push_back(i);

    system("pause");

}

void func1()

{

    map<int,int>m;

    for(int i=0;i<0x7ffff;i  )

        m.insert(pair<int,int>(i,i-1));

    system("pause");

}

int main() 

{

    func1();

    func2();



    system("pause");

    return 0 ;

}



Fnc 1を呼び出すだけで約4 Mのメモリが消費されます。Fnc 2を呼び出すだけで15 Mが消費されます。1を呼び出してから2を呼び出します。18 M mapに割り当てられたメモリはvectorに使われないといけません。あなたが今知っている限り、stlはこのように使ってメモリがないと漏れます。詳細については、「STLソース解析」を研究していただければ、分かるかもしれません。vectorとmapは元素サイズごとに違っていますので、システムメモリがなくなっていない限り、stlのmemory portはそれらの間で再利用されません。これで安心しました。ありがとうございます。