是否有任何代码片段演示了内存泄漏或免费内存malloced的危害

时间:2016-06-07 15:25:34

标签: c memory memory-management memory-leaks

我总是被告知需要释放之前的malloced记忆。但是,由于我多次忘记释放记忆,因此程序并没有显示出任何差异。我想知道是否有任何代码片段来展示之前的foget free memory malloced的危害。如果我放开它们,这些似乎没问题。

...
int i;
char *buff[64];
for( i = 0; i < 64; i++ ) {
    buff[i] = malloc(1024*100);
    strcpy( buff[i], "Some String");
    puts(buff[i]);
}
...

3 个答案:

答案 0 :(得分:1)

如果分配大量内存或重复分配内存,则会出现问题。分配64次100 KiB在现代计算机上不会让你受伤,但试着想象分配让100MB而不是释放它。

此外,如果你为不同的设备编程而不是PC(比如一些微控制器),内存要少得多(可能是数百个KiB或MiB),那就更大了。

为了缩短它 - 它可能不会在短期内伤害到你,但从长远来看,它可能是一个大问题。免费分配内存是一种很好的做法。如果你不想手动完成,那么你可以寻找一些智能指针和类似的解决方案(如果你可以使用C ++)。

答案 1 :(得分:1)

好的,我会解释这个问题。

  • 计算机内存有限(现代个人有大约8千兆字节)。 操作系统和应用程序需要内存,因此可以将代码加载到内存中并由CPU执行。
  • 现代系统将内存分成称为页面的大小相同的块,实际页面大小因系统而异。
  • 因此,计算机的页面大小有限(内存块)。如果正在运行的进程需要的页数超过限制,会发生什么?

    • 只需操作系统从内存中取出几页并将其保存到硬盘上,这称为交换
    • 稍后该过程可能需要一个换出的页面,因此操作系统会将其交换,因为硬盘速度慢得多,会严重影响性能

    • 如果有很多交换操作,这称为颠簸。

所以底线,如果有一个进程泄漏内存。系统将保持颠簸,进程将在一个长队列中等待硬盘设备。

我还鼓励您了解计算机体系结构和操作系统,以获得深入的见解。

答案 2 :(得分:-1)

如果您没有释放分配的内存,请尝试以下更改以使其具有足够的已分配内存以导致问题:

UIScrollView

那差不多是300千兆字节。