故意用内存泄漏破坏C应用程序
我是C语言的新手。我目前正在学习关于内存泄漏的知识,我正在尝试用一个简单的C程序创建一个。我应该一直运行,直到它崩溃,但当我运行它时,使用的内存峰值约为95%。我的代码不是内存泄漏吗?可以打开寻呼吗? 以下是我正在尝试的代码:故意用内存泄漏破坏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
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)被遗忘的内存卷击中了系统