如果我动态分配特定大小的内存,并且使用了分配的所有大小,是否还必须释放用于分配所述内存的指针? 更具体地说,我只想在输入字符串后才为该字符串分配内存。意思是直到输入后我才知道需要分配的大小。 而且,如果我分配了所需的全部资源并使用了所有资源,我仍然需要在完成后释放它吗?
编辑: 对于那些想知道的人,这是我正在编写的功能:
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;
}
很显然,我无法在函数末尾释放指针,因此我必须在主函数中释放它,但是当我这样做时,它只会崩溃。 我需要释放分配给每个名称字段的所有内存,然后释放实际的数组,但是由于某种原因它会崩溃。
答案 0 :(得分:1)
是的!无论如何,您都需要释放。
当您调用malloc
时,您基本上是在从操作系统中租用一块内存(实际上是依赖平台的)。当您调用free
时,您所做的就是保证不再使用内存块,因此操作系统可以将其用于其他目的。操作系统不知道您是否使用了所有内容,也不会在意。
仅在输入字符串后,我才想为字符串分配内存。
如果要在分配后调整该内存大小,请使用realloc
。但是,这对于您的特定情况不是一个好用处。致电malloc
时,您得到的块可能比您要的多。这有一些好处。如果选择realloc
来获得更大的内存块,则无需移动数据,重新分配的速度会更快。调用malloc
时,如果成功,您将获得一个指向至少所需大小的内存块的指针。它可以更大或相同大小。请记住,尽管这也适用于realloc
。您可以要求操作系统减少分配的内存块,但不能保证会真正发生这种情况。
重要提示:请记住,即使malloc
和realloc
可能返回一个指向比您所要求的更大的内存块的指针,但您切勿使用超出要求的数量。这样做会导致不确定的行为。
但是我想说,这听起来很像是不必要的微优化。
答案 1 :(得分:0)
释放内存与返回未使用的内存不一样。更像是归还您借来的东西(当然没有兴趣!)。
由于您知道调用size
时stud
数组的Create_Class
是什么,因此从数组返回时,可以迭代stud
Arr
中的元素,并释放分配给每个名称的内存。
最后,您可以释放整个Arr
。
释放通常按照相反的顺序进行。首先分配的是最先释放的,最后分配的是最先释放的。