C 没有内存泄漏

C 没有内存泄漏,c,memory,memory-leaks,C,Memory,Memory Leaks,在我的大学里,我们被要求创建一个分配所有空闲内存的程序。 所以我认为,在不释放内存的情况下进行无限循环和分配内存必须消耗掉计算机的所有可用内存。 然而,因为我没有释放内存,所以一定有一个巨大的内存泄漏 所以我写了一个简单的程序,但是当我用valgrind检查它时,没有内存泄漏。一点也没有。无直接泄漏,无间接泄漏 请告诉我为什么。这是我的节目: #include <stdio.h> #include <stdlib.h> #include <unistd.h>

在我的大学里,我们被要求创建一个分配所有空闲内存的程序。 所以我认为,在不释放内存的情况下进行无限循环和分配内存必须消耗掉计算机的所有可用内存。 然而,因为我没有释放内存,所以一定有一个巨大的内存泄漏

所以我写了一个简单的程序,但是当我用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;
}
#包括
#包括
#包括
int main()
{
int i,kb=0,mb=0;
一些;
而(1){
对于(i=0;i将
some=(char*)malloc(1024);
替换为:
some=new char[1024];

如果您至少有那么多的可用内存,它将在2000MB时失败。但是,如果您在Win32环境中运行此程序,它将不会分配计算机中的所有可用内存,因为每个进程都有2GB的限制,因此在这种情况下,您将需要另一种方法。

首先想到的是,分配已经过优化远离-通常是完全或推送到堆栈存储。在这种情况下,完全移除它会更好


您通常通过读取生成的程序集来证明或反驳这一点。

当我运行它时-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也不能消除这个错误。它是完整的样本吗

upd

该标志不会改变输出,但如果我在崩溃前中断程序,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)

在Linux下,内核不限制分配,而是限制内存的有效使用。 (见附件)

应禁用此选项,否则,如果使用0填充分配的内存,则代码应按预期运行:

some = (char*) malloc(1024);
if(some == NULL) {
   exit(EXIT_FAILURE);
}
memset(some, 0, 1024);
kb++;

也许是因为编译器发现从
malloc
返回的内存从未被使用,因此跳过了编译代码的那一部分?我投了+1票,因为我认为这是一个有趣的问题,我真的很想知道答案=)你在使用哪种编译器?很抱歉这么长时间没有回复。我被大学考试缠住了。我使用Clang作为编译器。我不能使用gcc的事实是,在我的ubuntu安装中,valgrind总是以某种方式拒绝安装。在我的vmware安装中,安装了fedora valgrind(我从it中的另一个位置获得此vmware映像fedora、clang、valgrind、xxd、lamp等都是预安装的)为什么这个行为应该是不同的?无论如何,这是C代码,所以<代码>新< /Cord>不会工作。C是不正确的,抱歉。我在C++中尝试过,它用一个新的异常,但没有用MALLC。这就是为什么我认为它可以帮助你。我在编程方面不是很好。我正在学习。你的第一行是有意义的。但是我不能。理解你的第二行。你能帮我更多吗。@Ishan你的编译器可以为你输出汇编代码。这基本上是你的源代码(程序)按配置生成(例如,使用优化设置)并转换为机器指令。学习读取汇编代码需要一些时间,因此,如果您以前从未这样做过,这可能不是最好的选择。我已经做了10年;我仍在学习:)嘿,当valgrind使用--leak check运行时,您能显示结果吗=full@Ishan标志本身不会更改输出
some = (char*) malloc(1024);
if(some == NULL) {
   exit(EXIT_FAILURE);
}
memset(some, 0, 1024);
kb++;