Удаление памяти в C

Как я удаляю память в C?

Например, я имею:

#include<stdlib.h>
#include<stdio.h>

struct list_el {
   int val;
   struct list_el * next;
};

typedef struct list_el item;

void main() {
   item * curr, * head;
   int i;

   head = NULL;

   for(i=1;i<=10;i++) {
      curr = (item *)malloc(sizeof(item));
      curr->val = i;
      curr->next  = head;
      head = curr;
   }

   curr = head;

   while(curr) {
      printf("%d\n", curr->val);
      curr = curr->next ;
   }
}

После того, как я создал объекты 1 - 10, как я удаляю его и удостоверяюсь, что это не существует в памяти?

6
задан Mitch Wheat 20 January 2010 в 03:51
поделиться

3 ответа

Отсутствие инкапсуляции в C++ (или Java). Любой объект может нарушить инкапсуляцию любого другого объекта, перепутать с его личными данными, если он того же типа. Например:

#include <iostream>
using namespace std;

class X
{
  public:
    // Construct by passing internal value
    X (int i) : i (i) {}

    // This breaks encapsulation
    void violate (X & other)
    {
        other.i += i;
    }

    int get () { return i; }

  private:
    int i;
};

int main (int ac, char * av[])
{
    X a(1), b(2), c(3);

    a.violate (c);
    b.violate (c);
    cout << c.get() << endl;    // "6"
}
-121--1760398-

free () используется для освобождения памяти, выделенной с помощью malloc () / calloc () , например:

curr = head; 

while(curr) {
    item *next = curr->next;
    free(curr);
    curr = next;
}

head = NULL;

(временная переменная используется, поскольку содержимое curr не может быть доступно после освобождения)

Кстати, лучшим способом записи строки malloc в C является:

curr = malloc(sizeof *curr);

(Это означает, что строка остается правильной, даже если тип curr изменен).

10
ответ дан 8 December 2019 в 17:21
поделиться

Re: Подводные камни. Проблема с int-as-bool заключается в том, когда люди делали это (как бы надуманно, но вы получаете идею):

typedef int BOOL
#define TRUE 1
#define FALSE 0

BOOL FDoSomething()
{
     // code code code
     return numTimesIDidSomething;
}

void Func()
{
     // code code code
     if(FDoSomething() == TRUE) // ERROR!
     {
          //etc
     }
}

Что является ошибкой, если numStartIdSomething больше 1.

Это приводит к двум вещам,

  1. Требование использовать странные конструкции, такие как!! boolVariable для «нормализации» всех ints-as-bools для TRUE
  2. Изобретение выделенного типа bool в C++

Просто используйте bool.

-121--2430180-

free () используется для освобождения памяти, выделенной с помощью malloc () / calloc () , например:

curr = head; 

while(curr) {
    item *next = curr->next;
    free(curr);
    curr = next;
}

head = NULL;

(временная переменная используется, поскольку содержимое curr не может быть доступно после освобождения).

Кстати, лучшим способом записи строки malloc в C является:

curr = malloc(sizeof *curr);

(Это означает, что строка остается правильной, даже если тип curr изменен).

-121--4213554-
curr = head;
while (curr != NULL) {
    head = curr->next;
    free (curr);
    curr = head;
}

сделает это.

Он в основном проводит curr по списку, удаляя его (используя head для хранения следующего) до тех пор, пока не закончатся элементы.

4
ответ дан 8 December 2019 в 17:21
поделиться
while(head != NULL)
{
  item* next = head->next;
  free(head);
  head = next;
}
0
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: