2010-12-09 2 views
1
#include <stdio.h> 
#include <stdlib.h> 

typedef struct data { 
    int a, b; 
} Data ; 

struct node { 
    Data info; 
    int priority; 
    struct node *link; 
}; 
typedef struct node* Node; 

void insert(Node header, int pr, Data el) { 
    Node cur = header; 
    Node tmp = malloc(sizeof(struct node)); 
    tmp->info = el; 
    tmp->priority = pr; 
    //descending <= 
    while (cur->link != NULL && pr >= cur->link->priority) 
     cur = cur->link; 
    tmp->link = cur->link; 
    cur->link = tmp; 
} 

Node delete(Node header) { 
    Node tmp; 
    if (header->link == NULL) 
     printf("Empty priority queue"); 
    else { 
     tmp = header->link; 
     header->link = tmp->link; 
     free(tmp); 
     return tmp; 
    } 
} 

void display(Node head) { 
    Node cur = head->link; 
    while (cur != NULL) { 
     printf("%d ", cur->priority); 
     cur = cur->link; 
    } 

} 

int main(int argc, const char *argv[]) 
{ 
    Data d; 
    Node tmp; 
    Node head = malloc(sizeof(struct node)); 
    head->link = NULL; 

    insert(head, 3, d); 

    insert(head, 2, d); 
    insert(head, 1, d); 
while (head->link != NULL) { 

    tmp = delete(head); 
    printf("%d ", tmp->priority); 
} 



    return 0; 
} 

Выходной сигнал это 1 2 3. но в процессе удаления я освободил память (бесплатно (tmp)), а затем возвратил tmp. почему tmp все еще печатает в основной функции. с использованием gcc-компиляторане может удалить ячейку памяти

+3

Почему ваш код доступа к памяти, которая уже была `free()`? Ed? Почему функция `delete()` возвращает указатель на `free()` 'ed memory в первую очередь? – 2010-12-09 03:59:01

ответ

7

delete/free не обязательно обнулять память. Они могут пометить ее как освобожденную для распределителя памяти. Затем распределитель памяти может снова выделить его в другом вызове new/malloc. Дело в том, что, как только вы освободили блок памяти, вы не должны обращаться к нему. Это undefined поведение. Неопределенное поведение означает, что он может упасть, вернуть мусор, вернуть старое значение, взорвать ваш компьютер, become a skynet или что-нибудь еще, в зависимости от реализации/ситуации.

Если вы хотите хранить конфиденциальную информацию, такую ​​как криптографические ключи/пароли в памяти, как можно короче, перед тем, как освободить ее, вы должны заполнить память чем-то другим (например, вызывая SecureZeroMemory в Windows).

Смежные вопросы