2016-05-01 8 views
-2

私はメモリリークを実験中です。 zshから次のプログラムを実行すると、起動してしばらくして終了します。 zshはそれをやっていますか?誰がそれをいつ殺すか決めますか?zshのプログラムリークメモリへの反応

#include <iostream> 
#include <stdlib.h> 

int main() { 
    int *a = (int *) malloc(sizeof(int)); 
    *a = 5; 

    std::cout << *a << std::endl; 

    for(int i = 0; i < 10000000000000000; ++i) { 
    int *c = (int *) malloc(1024); // 1kb per iteration 
    *c = 5; 
    std::cout << *c << std::endl; 
    } 
} 

答えて

1

それはあなたがそれを実行する方法によって異なりますが、通常はmalloc戻っNULL後にプロセスを殺す(新しいメモリを割り当てることができない場合)、あなたはそれに値(5)を書き込もうとするオペレーティングシステムであります住所。だから基本的にNULLのアドレスにメモリにアクセスしようとしているところでポインタの参照解除がNULLです。

哲学的に言えば、で、コードが正しく書かれず、プログラムがクラッシュすることになったプログラマです。 :-)

EDIT:それはあなたのプロセスにメモリをオーバーコミットしようとした場合一方、それはまだOS(またはそのプログラマー)の障害かもしれません。たとえば、デフォルトではメモリオーバーコミットがLinuxで有効になっています。つまり、OSがメモリを使用できない場合でも、メモリ割り当て方法を成功させることで、になり、プロセスが最初にアクセスしたときに実際にメモリを割り当てようとします。これにより、mallocが成功し、NULLの値を返し、プロセスがそのメモリにアクセスしようとすると、OSはその値を割り当てようとします。 OSに障害が発生すると、プロセスをブロック/一時停止するか、またはプロセスを終了する必要があります。 Linuxは通常、悪名高いOOM-killerを実行し、メモリ割り当てが失敗した場合にプロセスを選択します。そして、非常に頻繁に殺すプロセスは、あなたのプロセスである多くのメモリを割り当てるものです。

関連する問題