2016-07-14 16 views
-3

私は、プロセスを継続的に実行しています。いくつかのメモリが動的に割り当てられ、ヒープサイズが増加します。たとえば、20 MBのヒープメモリが割り当てられます(/ proc/pid/smapsにチェックインされています)。いくつかの条件が真であると、動的に割り当てられたメモリをクリアし、空き/削除演算子を呼び出す必要がありますが、プロセスは(連続的に)実行されます。実行中のプロセスのヒープメモリを消去しています。C++

class Object 
{ 
    vector <Object1> OB1; 
    vector <Object2> OB2; 
    //etc 
} 

class Object1 { 
    vector<string> temp2; 
    vector<string> temp1; 
    //etc 
} 
//similar for Object2 


std::vector <Object *> List; 

Object* temp; 
temp = new Object; 

//Work with Object and its members (also vectors inside) (so object Size increases accordingly as vector size increases. 

//insert into vector 
List.push_back(temp); 

//Now clear function 
freeFunc() 
    int i; 
    int size = List.size(); 
    if (size == 0) 
    return; 

    for (i = 0; i < size; i ++) 
    { 
    delete List[i]; 
     List[i] = NULL; 
    } 
    List.clear(); 
    vector <Object *>().swap(List); //swap with empty vector 
} 

実行中のプロセスでヒープメモリがクリアされますか?または、プロセスが停止された場合のみリリースされますか? 私は、条件が満たされた後にコード(freeFunc())がメモリを解放していないことに疑いを持っています。プロセスを強制終了したり停止させることはできません。

+1

は、メモリの非小チャンクを削除しましたシステムに戻ってください。プロセスを一時停止または強制終了する必要はありません。いずれにしても、C++のメモリ管理用のRAWポインタではなくRAIIを使用する必要があります。 – PSkocik

答えて

2

メモリが実際にOSにリリースされるのは、環境/ OSと基本的なmallocの実装に完全に依存します。

たとえば、ブロックが小さく再利用できる場合は、メモリを解放する必要はありません。 しかし、一般的には、それはそうなると想定することができます。

今、あなたのコードについては、私が使用することをリファクタリングでしょうが:

vector <unique_ptr<Object>> objects; 

し、それを解放すると、自由に、すべてのオブジェクトあなただけ呼び出すことができます/フリード

objects.clear(); 
+0

ブロックは比較的大きい(約100MB +)。 – Pogo

+1

それはおそらく解放されるでしょう。裸の新しい/削除のスティルを使用しないという提案 –

関連する問題