Подтвердить что ты не робот

C свободный и структура

Мой вопрос о функции C free() для освобождения блоков памяти, ранее выделенных с помощью malloc().
Если у меня есть тип данных структуры, составьте несколько указателей, каждый из которых указывает на разные ячейки памяти, что произойдет с этими ячейками памяти, если я применил free() в структуре? будут ли эти места свободными? или просто блок памяти, который выделяет указатель?

4b9b3361

Ответ 1

Нет. Они не будут освобождены. Вы должны освободить их "вручную". Malloc ничего не знает о содержании вашей структуры (он не знает, что это структура вообще, это всего лишь "кусочек памяти" с его точки зрения).

Ответ 2

Если вы освободите только структуру, память, на которую указывают указатели внутри структуры, не будет освобождена (предполагается, что она была mallocd). Сначала вы должны освободить их.

Вы можете использовать valgrind (если доступно), чтобы убедиться сами:

#include <stdlib.h>

struct resources{
   int * aint;
   double * adouble;
};                                                                              
int main(){

   int* someint = malloc(sizeof(int) * 1024);
   double* somedouble = malloc(sizeof(double)* 1024);

   struct resources *r  = malloc(sizeof(struct resources));

   r->aint = someint;
   r->adouble = somedouble;

   free (r);
   return 0;

}

$ gcc test_struct.c -o test
$ valgrind ./test
==9192== Memcheck, a memory error detector
==9192== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==9192== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==9192== Command: ./test
==9192== 
==9192== 
==9192== HEAP SUMMARY:
==9192==     in use at exit: 12,288 bytes in 2 blocks
==9192==   total heap usage: 3 allocs, 1 frees, 12,296 bytes allocated
==9192== 
==9192== LEAK SUMMARY:
==9192==    definitely lost: 12,288 bytes in 2 blocks
==9192==    indirectly lost: 0 bytes in 0 blocks
==9192==      possibly lost: 0 bytes in 0 blocks
==9192==    still reachable: 0 bytes in 0 blocks
==9192==         suppressed: 0 bytes in 0 blocks
==9192== Rerun with --leak-check=full to see details of leaked memory
==9192== 
==9192== For counts of detected and suppressed errors, rerun with: -v
==9192== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 12 from 7)

Ответ 3

struct Node
{
  struct Node *nextSibling;
  struct Node *prevSibling;
  struct Node *parentNode;
  ...
};
...
struct Node *rootNode;
/* Initialize `rootNode' and fill in its various fields;
   do the same with more nodes.  */

Если вы используете free(rootNode), он освободит только память этого единственного node. Другими словами, у вас будет выделенная куча памяти, которую вы не сможете освободить, если вы не освободите ее, прежде чем освобождать память, используемую node, которую вы действительно хотите удалить.

Ответ 4

Чтобы уточнить ответ @Chrono Kitsune, все равно можно было бы освободить указатели внутри структуры, но это было рискованно.

Что free(rootNode) действительно указывает модулю управления памятью, что пространство памяти, которое было использовано rootNode, больше не используется и является честной игрой для чего-то еще, что в ней нуждается. Хотя, rootNode все еще указывает на то же место, теперь он считается недопустимым указателем, и его содержимое может быть повреждено, потому что его местоположение теперь может быть перезаписано другими вещами.

Если вы попытаетесь получить доступ к rootNode сразу после его освобождения, он может работать, но нет никакой гарантии, поэтому безопаснее free его содержимого (которые были malloc 'd ) до удаления rootNode себя.