如果使用了所有内存,是否必须释放动态分配的内存?

时间:2018-08-19 12:03:04

标签: c

如果我动态分配特定大小的内存,并且使用了分配的所有大小,是否还必须释放用于分配所述内存的指针? 更具体地说,我只想在输入字符串后才为该字符串分配内存。意思是直到输入后我才知道需要分配的大小。 而且,如果我分配了所需的全部资源并使用了所有资源,我仍然需要在完成后释放它吗?

编辑: 对于那些想知道的人,这是我正在编写的功能:

student* Create_Class(int size)
{
    struct stud *Arr;
    int i, j, k;
    char YourName[51];
    int length;
    Arr = (struct stud*)malloc(size * sizeof(struct stud));
    for (i = 0; i < size; i++)
    {
        printf("Enter your name: ");
        scanf(" %s", YourName);
        length = strlen(YourName);
        (Arr + i)->name = (char*)malloc(length * sizeof(char));
        for (k = 0; k < length; k++)
            (Arr + i)->name[k] = YourName[k];
        (Arr + i)->name[k] = '\0';
        printf("Enter your marks: ");
        for (j = 0; j < 4; j++)
            scanf("%d", &(Arr + i)->marks[j]);
    }
    for (i = 0; i < size; i++)
        Avg_Mark(Arr + i);
    return Arr;
}

很显然,我无法在函数末尾释放指针,因此我必须在主函数中释放它,但是当我这样做时,它只会崩溃。 我需要释放分配给每个名称字段的所有内存,然后释放实际的数组,但是由于某种原因它会崩溃。

2 个答案:

答案 0 :(得分:1)

是的!无论如何,您都需要释放。

当您调用malloc时,您基本上是在从操作系统中租用一块内存(实际上是依赖平台的)。当您调用free时,您所做的就是保证不再使用内存块,因此操作系统可以将其用于其他目的。操作系统不知道您是否使用了所有内容,也不会在意。

  

仅在输入字符串后,我才想为字符串分配内存。

如果要在分配后调整该内存大小,请使用realloc。但是,这对于您的特定情况不是一个好用处。致电malloc时,您得到的块可能比您要的多。这有一些好处。如果选择realloc来获得更大的内存块,则无需移动数据,重新分配的速度会更快。调用malloc时,如果成功,您将获得一个指向至少所需大小的内存块的指针。它可以更大或相同大小。请记住,尽管这也适用于realloc。您可以要求操作系统减少分配的内存块,但不能保证会真正发生这种情况。

重要提示:请记住,即使mallocrealloc可能返回一个指向比您所要求的更大的内存块的指针,但您切勿使用超出要求的数量。这样做会导致不确定的行为。

但是我想说,这听起来很像是不必要的微优化。

答案 1 :(得分:0)

释放内存与返回未使用的内存不一样。更像是归还您借来的东西(当然没有兴趣!)。

由于您知道调用sizestud数组的Create_Class是什么,因此从数组返回时,可以迭代stud Arr中的元素,并释放分配给每个名称的内存。 最后,您可以释放整个Arr

释放通常按照相反的顺序进行。首先分配的是最先释放的,最后分配的是最先释放的。