S1E48:内存池 课后作业

测试题:
0. 内存碎片和内存泄漏的区别是什么呢?

答:内存碎片(释放了的空间,但是系统不会再利用这片内存了);内存泄漏(内存超限,数据超出了定义的内存范围)(错误

答案:内存碎片和内存泄露是两个不同的概念,它们都会对程序的性能和稳定性产生负面影响。
内存泄露是指程序在分配了内存后,忘记或无法释放,导致这部分内存无法再次使用;
而内存碎片是由于频繁地分配和释放不同大小的内存块,导致内存中留下许多小的、不连续的内存块,降低了内存的利用效率。


1. 请使用简单的代码,举一个可能导致内存碎片的例子?

答:

struct Node *node = (struct Node *)malloc(sizeof(struct Node));

free(node);

答案:在以下的代码中,我们频繁地进行小块内存的分配和释放,这可能会导致内存碎片。

解析:内存碎片问题在一段简单的代码中可能不容易看出,因为它依赖于内存分配器的具体行为以及程序的运行时间。l
在实际的大型程序中,频繁的小块内存分配和释放可能会导致明显的性能问题。

#include <stdio.h>
#include <stdlib.h>
    
void memory_fragment() 
{
    for (int i = 0; i < 1000000; ++i)
    {
        // 分配10字节的内存
        char *buffer = malloc(10);
        if (buffer == NULL) 
        {
            printf("内存分配失败。\n");
            return;
        }
    
        // 使用这个缓冲区做一些操作...
    
        // 释放内存
        free(buffer);
    }
}

int main() 
{
    memory_fragment();
    return 0;
}


2. 请使用简单的代码,举一个可能导致内存泄漏的例子?

答:错误?

int p[10] = {0,1,2,3,4,5,6,7,8,9,10,11};

答案:在以下的代码中,我们创建了一个动态数组,但在函数结束时忘记释放内存,这就导致了内存泄漏。

#include <stdio.h>
#include <stdlib.h>
    
void memory_leak() 
{
    // 使用malloc动态分配100个整数的内存
    int *array = malloc(100 * sizeof(int));
    if (array == NULL) 
    {
        printf("内存分配失败。\n");
        return;
    }
    
    // 使用这个数组做一些操作...
    
    // 忘记释放内存,导致内存泄漏
    // free(array);
}
    
int main() 
{
    memory_leak();
    return 0;
}


{&eDjn`9Mk;Z)H'a52RQr
3. 链表和数组,哪一个结构更容易造成内存碎片?

答:链表,因为链表需要手动申请内存,再通过free释放

答案:链表。
解析:链表和数组都是常用的数据结构,但它们对内存的使用方式和可能造成的内存碎片情况不同。
链表中的每个节点都需要单独分配内存,并且这些节点在内存中的位置可能是分散的。
因此,链表在频繁插入和删除节点时可能会产生许多小的内存碎片。
数组相比之下,数组通常在连续的内存地址空间中分配,因此不太可能


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值