Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法删除内存位置_C_Memory Management - Fatal编程技术网

C 无法删除内存位置

C 无法删除内存位置,c,memory-management,C,Memory Management,它的输出是1 2 3。但在delete中,我解除了memoryfreetmp的分配,然后返回了tmp。为什么tmp还在主要功能中打印。使用gcc编译器删除/释放不一定会清空内存。他们可以将其标记为内存分配器的解除分配。然后,内存分配器可以在另一个新的/malloc调用中再次分配它。关键是,一旦释放内存块,就不应该访问它。这是未定义的行为。未定义的行为意味着它可能崩溃、返回垃圾、返回旧值、炸毁计算机或其他任何东西,具体取决于实现/情况 如果您想在内存中尽可能短地存储加密密钥/密码等敏感信息,则在释

它的输出是1 2 3。但在delete中,我解除了memoryfreetmp的分配,然后返回了tmp。为什么tmp还在主要功能中打印。使用gcc编译器删除/释放不一定会清空内存。他们可以将其标记为内存分配器的解除分配。然后,内存分配器可以在另一个新的/malloc调用中再次分配它。关键是,一旦释放内存块,就不应该访问它。这是未定义的行为。未定义的行为意味着它可能崩溃、返回垃圾、返回旧值、炸毁计算机或其他任何东西,具体取决于实现/情况

如果您想在内存中尽可能短地存储加密密钥/密码等敏感信息,则在释放内存之前,您应该先用其他内容填充内存,例如通过调用Windows。

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


如果您希望在内存中尽可能短地存储加密密钥/密码等敏感信息,则在释放内存之前,您应该先用其他内容填充内存,例如通过调用Windows。

为什么您的代码要访问已释放的内存?为什么delete函数首先返回一个指向空闲内存的指针?作为补充,我不确定我是否特别喜欢节点typedef。如果有人只查看您的函数定义,乍一看,您似乎是在通过值传递,而不是通过引用传递。在这里使用typedef会降低可读性。不过,这只是我的看法:@Demian:我同意,但我的大学教授过去也做过同样的事情。我讨厌它,但有些人似乎喜欢在typedefs中隐藏指针。为什么你的代码要访问已经释放的内存?为什么delete函数首先返回一个指向空闲内存的指针?作为补充,我不确定我是否特别喜欢节点typedef。如果有人只查看您的函数定义,乍一看,您似乎是在通过值传递,而不是通过引用传递。在这里使用typedef会降低可读性。不过,这只是我的看法:@Demian:我同意,但我的大学教授过去也做过同样的事情。我讨厌它,但有些人似乎喜欢在typedef中隐藏指针。
#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;
}