无法删除内存位置

时间:2010-12-09 03:55:12

标签: c memory-management

#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.但在删除时我释放了内存(free(tmp))然后返回tmp。为什么tmp仍然在主要功能中打印。使用gcc编译器

1 个答案:

答案 0 :(得分:7)

delete / free不一定将内存清零。他们可以将其标记为内存分配器的解除分配。然后,内存分配器可以在另一个new / malloc调用中再次分配它。关键是,一旦释放了内存块,就不应该访问它。这是未定义的行为。未定义的行为意味着它可能会崩溃,返回垃圾,返回旧值,炸毁您的计算机,become a skynet或其他任何内容,具体取决于实施/情况。

如果您希望尽可能缩短内存中的加密密钥/密码等敏感信息,您应该在释放之前用自己的其他内容填充内存(例如,通过在Windows中调用SecureZeroMemory)。