2016-06-07 43 views
-5

我总是被告知需要释放最后配合的内存。但是自从我多次解放内存之后,这个程序并没有显示出任何不同。我想知道是否有任何代码片段来展示之前配置的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]); 
} 
... 
+4

一个合理的现代计算机可以有多个千兆字节的内存。你分配少于两千字节。你怎么看? – EOF

+0

谢谢你的评论,现在怎么样,我改变了大小 – Tee

+0

即使更新bro后,你分配64 * 1024 * 100字节,这是6.25兆字节。 –

回答

1

好吧我会解释这个问题。

  • 计算机有限的内存(现代个人有约8千兆字节)。 操作系统和应用程序需要内存,以便将其代码加载到内存中并由CPU执行。
  • 现代系统内存分割成所谓的页面同样大小的块,实际页面大小的系统不同而有所不同
  • 因此,计算机具有的页面(内存块)大小的限制。如果正在运行的进程需要,会发生什么比限制更多的页面?

    • 简单的操作系统会从内存中的几页,并将其保存到硬盘,这被称为交换
    • 后来的过程中可能需要的是被换出的页面,所以操作系统会将其交换进去,因为硬盘慢得多,它会严重影响性能

    • 如果有很多交换操作,这称为抖动。

因此,底线,如果谁泄露内存的过程。系统将持续抖动,进程将等待硬盘设备的长队。

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

+0

非常感谢你!交换是指将几页内容复制到磁盘中? – Tee

+0

@Tee,是的......这叫做交换......而反向操作被称为交换 –

1

如果您分配大量内存或重复分配内存,则会出现问题。在现代计算机上分配64倍100 KiB不会对你造成伤害,但试图想象分配可以说100MB而不是释放它。

另外,如果你用不同的设备编程而不是PC(可以说一些微控制器)内存少得多(可能是数百KiB或MiB),这是一个更大的问题。

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

+0

我只想知道它是什么时候会导致问题,是否会导致其他程序崩溃或使自己崩溃或使系统崩溃? – Tee

+0

想象一下,所有应用程序都会分配内存并且不释放它。一段时间后,系统将耗尽内存并开始交换(甚至崩溃)。所以是的,它可能会导致其他应用程序或系统崩溃,因为它们无法分配内存。 – Klinki

+0

谢谢,我给你一个“up” – Tee

-1

试试下面的变化,使其有足够的内存分配导致的问题,如果你不释放所分配的内存:

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

这是近300千兆字节。

+4

你可能想了解延迟分配和编译器优化。然后想知道为什么代码仍能在标准PC上运行。 – Olaf

+0

啊,我的错。抱歉。 – user1837296