1

私の大学では、すべての空きメモリを割り当てるプログラムを作成するように依頼されました。したがって、無限ループを作成し、解放せずにメモリを割り当てると、コンピューターの空きメモリをすべて消費する必要があると考えました。ただし、メモリを解放していないため、大量のメモリ リークが発生しているはずです。

そこで簡単なプログラムを書いてみたのですが、valgrind で確認したところメモリリークはありませんでした。何もありません。直接的な漏れも間接的な漏れもありません。

どうしてか言ってくれない。ここに私のプログラムがあります:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int i,kb=0,mb=0;
    char *some;
    while(1) {
        for(i=0;i<1024;i++)
        {
            // Allocating memory one kilobyte a time.
            some = (char*) malloc(1024);
            if(some == NULL)
            {
                exit(EXIT_FAILURE);
            }
            kb++;
        }
        // Displaying no. of mbs that have been allocated at each mb
        mb++;
        printf("%d mb\n",mb);
    }
    return 0;
}
4

4 に答える 4

0

最初に思い浮かぶのは、割り当てが最適化されていないことです。通常は完全に、またはスタック ストレージにプッシュされます。この場合、完全に削除することをお勧めします。

通常、生成されたアセンブリを読み取ることで、これを証明または反証します。

于 2013-05-08T08:59:19.453 に答える
0

Linux では、カーネルは割り当てを制限するのではなく、メモリの効果的な使用を制限します。( https://www.kernel.org/doc/Documentation/vm/overcommit-accountingを参照)

$ echo 2 > /proc/sys/vm/overcommit_memory

これを無効にする必要があります。そうしないと、割り当てられたメモリに 0 を埋め込むと、コードが期待どおりに実行されます。

some = (char*) malloc(1024);
if(some == NULL) {
   exit(EXIT_FAILURE);
}
memset(some, 0, 1024);
kb++;
于 2014-06-07T08:12:20.460 に答える
0

実行すると、valgrind が問題を検出します。

==3335==
==3335== HEAP SUMMARY:
==3335==     in use at exit: 2,271,338,496 bytes in 2,218,104 blocks
==3335==   total heap usage: 2,218,105 allocs, 0 frees, 2,271,338,496 bytes allocated
==3335== 
==3335== 
==3335==     Valgrind's memory management: out of memory:
==3335==        newSuperblock's request for 8876032 bytes failed.
==3335==        3116339200 bytes have already been allocated.
==3335==     Valgrind cannot continue.  Sorry.
==3335== 
==3335==     There are several possible reasons for this.
==3335==     - You have some kind of memory limit in place.  Look at the
==3335==       output of 'ulimit -a'.  Is there a limit on the size of
==3335==       virtual memory or address space?
==3335==     - You have run out of swap space.`

O2 O3 を使用しても、そのエラーは解消されません。フルサンプルですか?

更新

フラグは出力を変更しませんが、クラッシュする前にプログラムを中断すると、valgrind は次のように表示されます。

^C1890 mb
==3286== 
==3286== HEAP SUMMARY:
==3286==     in use at exit: 1,981,808,640 bytes in 1,935,360 blocks
==3286==   total heap usage: 1,935,360 allocs, 0 frees, 1,981,808,640 bytes allocated
==3286== 
==3286== 276,480 bytes in 270 blocks are possibly lost in loss record 2 of 3
==3286==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3286==    by 0x8048472: main (mem_test.c:13)
==3286== 
==3286== 1,981,530,112 bytes in 1,935,088 blocks are definitely lost in loss record 3 of 3
==3286==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3286==    by 0x8048472: main (mem_test.c:13)
==3286== 
==3286== LEAK SUMMARY:
==3286==    definitely lost: 1,981,530,112 bytes in 1,935,088 blocks
==3286==    indirectly lost: 0 bytes in 0 blocks
==3286==      possibly lost: 276,480 bytes in 270 blocks
==3286==    still reachable: 2,048 bytes in 2 blocks
==3286==         suppressed: 0 bytes in 0 blocks
==3286== Reachable blocks (those to which a pointer was found) are not shown.
==3286== To see them, rerun with: --leak-check=full --show-reachable=yes
==3286== 
==3286== For counts of detected and suppressed errors, rerun with: -v
==3286== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
于 2013-05-08T09:56:10.470 に答える