2017-11-07 1 views
-1

メモリを解放してリストに割り当てる方法を教えてください。次のコードでは、リストを消去してリストへのポインタを削除しても、メモリを解放しません。私はシステムモニタでプログラムが撮影したメモリを見ることができます。 リストに割り当てられたメモリを効率的に削除する方法はありますか?リストに割り当てられたメモリを解除する方法は?

struct Plot 
{ 
    int BUFFER[65535]; 
    int BUFFER1[65535]; 
    int BUFFER2[65535]; 
    int BUFFER3[65535]; 
    int BUFFER4[65535]; 
}; 
int main(int argc, char *argv[]) 
{ 

    std::list<Plot> *LIST= new std::list<Plot>(); 


    Plot PLOT; 
int i=0; 
while(i<1500) 
{ 

    (LIST)->push_back(PLOT); 
    i++; 
    usleep(100); 
} 


LIST->clear(); 

delete LIST; 

while(1) 
{ 
    usleep(100); 
} 
} 
+4

割り当てられたメモリが正しく解放され、リークはありません。 C++ライブラリの内部では多くのことが隠されているため、システムモニタに依存することはできません。たとえば、解放されたメモリはすぐにシステムに返されないかもしれませんが、ライブラリはそれ自身の空きメモリプールにシステムから直接メモリを要求するのではなく、プールから後続の割り当てを行います。それは完全に実装に依存します。 –

+0

厳しいメモリ管理が懸念される場合は、カスタムアロケータの使用を検討してください。 –

+0

これは単なるサンプルコードです。私はメモリが無限に増加している同様のコードを持っています。 Valgringは、新しい演算子でのメモリリークも示します。 –

答えて

1

このわずかに変更されたプログラムは、Windowsマシンでのみ実行されています。

お使いのプラットフォームでこれを試してみてください。

(免責事項:これはちょうどOPのコードに固執するためには、ひどいコードです)

#include <list> 
#include <windows.h> 

struct Plot 
{ 
    int BUFFER[65535]; 
    int BUFFER1[65535]; 
    int BUFFER2[65535]; 
    int BUFFER3[65535]; 
    int BUFFER4[65535]; 
}; 

int main(int argc, char *argv[]) 
{ 
    int i = 0; 

    while (1) 
    { 
    printf("Iteration %d\n", i++); 

    std::list<Plot> *LIST = new std::list<Plot>(); 

    static Plot PLOT; 
    int i = 0; 
    while (i < 1500) 
    { 
     (LIST)->push_back(PLOT); 
     i++; 
    } 

    LIST->clear(); 
    delete LIST; 

    Sleep(100); 
    } 
} 

そして、これは、システムモニタは(1つの部門が1.6 GBです私を示していること対時間のメモリ使用量であります。):

enter image description here

そして、これは私が代わりにデバッグモードのリリースモードでコンパイルした同じプログラムを実行すると、システムモニタが私を示したものです、それは、まったく違うメモリアロケータの内部実装は合計であるため、リリースモードでLY異なる:

enter image description here

しかし、私たちが見ることができるように、メモリが正しく両方のバージョンで解放され、プログラムがまだバックグラウンドで実行されています。

関連する問題