Как я удаляю память в 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, как я удаляю его и удостоверяюсь, что это не существует в памяти?
Отсутствие инкапсуляции в 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
изменен).
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.
Это приводит к двум вещам,
Просто используйте 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
изменен).
curr = head;
while (curr != NULL) {
head = curr->next;
free (curr);
curr = head;
}
сделает это.
Он в основном проводит curr
по списку, удаляя его (используя head
для хранения следующего) до тех пор, пока не закончатся элементы.
while(head != NULL)
{
item* next = head->next;
free(head);
head = next;
}