Ç - 释放结构(C - freeing structs)

2019-06-21 07:56发布

比方说,我有这样的结构

typedef struct person{
    char firstName[100], surName[51]
} PERSON;

而我通过的malloc分配空间,并与一些价值观加油吧

PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");

什么是释放由该结构所采取的一切记忆的正确和安全的方式? 是 “免费(testPerson);” 足够或做我需要释放每个结构的属性逐一?

这使我另一个问题 - 如何存储在内存中的结构? 我注意到一个奇怪的现象 - 当我尝试打印结构地址是等于它的第一属性的地址。

printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);

这意味着该无(testPerson)应等于这种免费(testPerson->的firstName);

而这不是我想做的事情。

谢谢

Answer 1:

答案很简单: free(testPerson)就足够了。

记住你可以用free()只有当您使用分配的内存malloccallocrealloc

在你的情况,你只malloc内存为testPerson因此释放足以。

如果您使用char * firstname , *last surName然后在这种情况下存储姓名必须已分配的内存,这就是为什么你必须单独释放每个成员。

这里还应该以相反的顺序的点; 这意味着,分配给元素存储完成之后,从而free()它首先然后释放指针对象。

释放每一个元素,你可以看到如下所示的演示:

typedef struct Person
{
char * firstname , *last surName;
}Person;
Person *ptrobj =malloc(sizeof(Person)); // memory allocation for struct
ptrobj->fistname = malloc(n); // memory allocation for firstname
ptrobj->surName = malloc(m); // memory allocation for surName

.
. // do whatever you want

free(ptrobj->surName);
free(ptrobj->firstname);
free(ptrobj);

这背后的原因是,如果你释放ptrobj第一,那么就会出现内存泄漏是由分配的内存firstnamesuName指针。



Answer 2:

因为你所定义的struct是由char数组,两个字符串的结构和释放的struct是足够的,也没有一个释放的方式struct ,但保持数组。 对于这种情况,你会想要做类似struct { char *firstName, *lastName; } struct { char *firstName, *lastName; } ,但你需要为名称单独分配内存和处理的何时释放内存的问题。

旁白:有没有你想保留的名字后一个原因, struct已被释放?



Answer 3:

首先,你应该知道,当你定义了多少内存分配,并在以下情况下分配内存。

   typedef struct person{
       char firstName[100], surName[51]
  } PERSON;
  PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));

1)的sizeof(人)现在返回151个字节(不包括填充物)

2)的151个字节的存储器堆被分配。

3)自由,调用free(testPerson)。

但如果你宣布你的结构

  typedef struct person{
      char *firstName, *surName;
  } PERSON;
  PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));

然后

1)的sizeof(人)现在返回8个字节(不包括填充物)

2)需要通过调用的malloc()或释放calloc()来分配用于firstName和姓存储。 喜欢

        testPerson->firstName = (char *)malloc(100);

3)以释放,第一释放构件在结构中比游离的结构体。 即,自由(testPerson->的firstName); 自由(testPerson->姓氏); 自由(testPerson);



Answer 4:

这样,你只需要释放的结构,因为这些场与将被分配为结构的一部分静态大小的阵列。 这也是该地址你看比赛的原因:阵列处于该结构的第一件事。 如果声明的字段为char *您必须手动malloc和free他们。



Answer 5:

Mallocs和释放需要进行配对。

抓住的malloc的内存人足够大的一大块。

当你释放你告诉malloc的开始“这里的”一块内存不再需要,它知道多少分配和释放它。

无论你打电话

 free(testPerson) 

要么

 free(testPerson->firstName)

所有的free()的实际接收到的是一个地址,同一个地址,它不能告诉你叫。 您的代码更清晰,如果您使用免费(testPerson)虽然 - 它清楚地匹配了使用malloc。



Answer 6:

你不能自由类型不动态分配。 虽然阵列是语法上类似( int* x = malloc(sizeof(int) * 4)可以在相同的方式使用int x[4]是),呼叫free(firstName)可能会导致后者的错误。

例如,利用这个代码:

int x;
free(&x);

free()是一个函数,它接受在一个指针。 &x是一个指针。 这段代码可以编译,即使它是行不通的。

如果我们假装所有内存被以同样的方式分配, x被“分配”的定义中,“解放”在第二条线,再范围结束后,“解放”了。 你不能释放同一个资源的两倍; 它会给你一个错误。

这甚至不是提的事实,出于某些原因,你可能无法提供免费存储x不关闭程序。

TL;博士:刚刚释放struct ,你会没事的。 不要在阵列拨打免费; 只有调用它动态分配的内存。



Answer 7:

free是不够的, free只是标志着内存为未使用,该结构数据将在那里,直到覆盖。 为了安全起见,将指针NULLfree

例如:

if (testPerson) {
    free(testPerson);
    testPerson = NULL;
}

struct是像一个数组类似,它是一个内存块。 您可以访问通过其偏移结构成员。 所述第一结构的构件被放置在偏移0 ,从而第一结构的成员的地址是相同结构的地址。



文章来源: C - freeing structs
标签: c struct malloc