Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
故意用内存泄漏破坏C应用程序_C_Memory Leaks - Fatal编程技术网

故意用内存泄漏破坏C应用程序

故意用内存泄漏破坏C应用程序,c,memory-leaks,C,Memory Leaks,我是C语言的新手。我目前正在学习关于内存泄漏的知识,我正在尝试用一个简单的C程序创建一个。我应该一直运行,直到它崩溃,但当我运行它时,使用的内存峰值约为95%。我的代码不是内存泄漏吗?可以打开寻呼吗? 以下是我正在尝试的代码: int main(void) { while (1) { char *newArea = malloc(10); char *mainArea = malloc(10000); mainArea = newA

我是C语言的新手。我目前正在学习关于内存泄漏的知识,我正在尝试用一个简单的C程序创建一个。我应该一直运行,直到它崩溃,但当我运行它时,使用的内存峰值约为95%。我的代码不是内存泄漏吗?可以打开寻呼吗? 以下是我正在尝试的代码:

int main(void) {
    while (1)
    {
        char *newArea = malloc(10);
        char *mainArea = malloc(10000);
        mainArea = newArea;
    }
}

为了使程序更快、更少地消耗内存,许多操作系统在实际使用动态内存之前不分配任何动态内存。您的代码从不使用动态内存,因此操作系统可能不会分配任何内容,它只是保留该内存


因此,如果您只是尝试在分配的内存中的某个位置写入,您应该会像预期的那样耗尽内存,因为您将强制操作系统执行实际分配。

为了使程序更快、更少地消耗内存,许多操作系统在您实际使用它之前不会分配任何动态内存。您的代码从不使用动态内存,因此操作系统可能不会分配任何内容,它只是保留该内存


因此,如果您只是尝试在分配的内存中的某个位置写入,您应该按照预期耗尽内存,因为您将强制操作系统执行实际分配。

您所做的只是耗尽可用内存,您可以做得更简单–只需分配内存,然后忘记它:

int main(void)
{
    while (1)
    {
        (void) malloc(10000);
    }
    return 0;  // will never get here!
}
然而,内存泄漏是另一回事——它是为某些任务分配内存,而不是在任务完成后进行处理。例如:

int main(void)
{
    while (StillSomethingToDo())
    {
        char *membuffer = malloc(10000);

        DoSomethingWithTheBuffer(membuffer);

        // forget to free(membuffer)
    }
    return 0; // will return normally
}

循环终止后,当
StillSomethingToDo()
返回'false'时,
main()
继续执行
return
,但是堆上有一些块(可能有很多块)不是
空闲的
-d。而且它们无法再被释放,因为指向它们的指针(所有以前的
membuffer
变量值)都丢失了。

您所做的只是耗尽可用内存,您可以做得更简单–只需分配内存,然后忘记它:

int main(void)
{
    while (1)
    {
        (void) malloc(10000);
    }
    return 0;  // will never get here!
}
然而,内存泄漏是另一回事——它是为某些任务分配内存,而不是在任务完成后进行处理。例如:

int main(void)
{
    while (StillSomethingToDo())
    {
        char *membuffer = malloc(10000);

        DoSomethingWithTheBuffer(membuffer);

        // forget to free(membuffer)
    }
    return 0; // will return normally
}

循环终止后,当
StillSomethingToDo()
返回'false'时,
main()
继续执行
return
,但是堆上有一些块(可能有很多块)不是
空闲的
-d。它们无法再被释放,因为指向它们的指针(所有以前的
membuffer
变量的值)都丢失了。

尝试写入空格您的代码正在泄漏内存,但无法崩溃,因为您没有使用mallocated内存。您应该检查malloc的返回值。如果您得到0,则它无法分配内存。M.M我不理解您的评论(此为新评论)。那么,我该如何使用位置不正确的内存呢?你能建议一个不同的方法吗?好的,下面是你要做的。首先,忘记微小的
malloc(10)
,它是无用的,删除它。您还可以在调用
malloc
之后删除对
mainArea
的无用分配。然后,选择一些大的尺寸,比如10000或100000,或者可能是两个的幂-这没什么大不了的。然后记录在返回
NULL
之前调用
malloc
的次数。然后,您成功分配的数量为
count*size
。请尝试将代码写入空格。您的代码正在泄漏内存,但无法崩溃,因为您没有使用mallocated内存。您应该检查malloc的返回值。如果您得到0,则它无法分配内存。M.M我不理解您的评论(此为新评论)。那么,我该如何使用位置不正确的内存呢?你能建议一个不同的方法吗?好的,下面是你要做的。首先,忘记微小的
malloc(10)
,它是无用的,删除它。您还可以在调用
malloc
之后删除对
mainArea
的无用分配。然后,选择一些大的尺寸,比如10000或100000,或者可能是两个的幂-这没什么大不了的。然后记录在返回
NULL
之前调用
malloc
的次数。然后,您成功分配的数量是
count*size
。那么,我可以用什么方法使用位置不正确的内存使应用程序崩溃呢?此外,写入“已分配”内存将使其在第一次无法满足分配请求且返回
NULL
时崩溃,哪个解引用会导致分段错误…那么,我可以用什么方法使用位置不正确的内存使应用程序崩溃呢?此外,写入“已分配”内存将使它在第一次无法满足分配请求并且返回
NULL
时崩溃,哪个解引用将导致分段错误…但在进程结束时,它分配的所有内存(无论是否已使用)都将被释放。@mcleod_ideafix当然!当进程终止时,系统分配给进程的所有内存都返回到系统。但是,有些流程设计为长时间工作,甚至在系统停机之前根本不会终止,例如系统服务。这种情况下,内存泄漏造成的问题最多,因为1)它浪费了系统资源,2)被遗忘的内存量最终会命中系统的每进程树,这使得进程过早终止。但在进程结束的那一刻,它分配(使用或未使用)的所有内存都会被释放。@mcleod_ideafix当然!当进程终止时,系统分配给进程的所有内存都返回到系统。但是,有些流程设计为长时间工作,甚至在系统停机之前根本不会终止,例如系统服务。在这种情况下,内存泄漏造成的问题最多,因为1)它浪费了系统资源,2)被遗忘的内存卷击中了系统