c - 内存管理 C 和指针的 free()

标签 c pointers memory-management

所以我对如何进行正确的内存管理有一些疑问。

基本上我的问题是,当我使用这段代码(如下所示)时会发生什么。是否需要释放它以防止内存泄漏?

    void traverseLeftRight(struct node *head){

        current = head;

        if(current == NULL){

            printf("There are no nodes within the list\n");
        }

        while(1){

            if(current != NULL){

                printf("left to right output:           %d\n", current -> value);
                current = current -> next;
            }else{

                break;
            }
        }
    }

此外,如果我在列表的中断部分执行操作,free(current) 和 current = NULL 是否会中断列表。另外,这样的事情是否只会破坏指向变量而不影响它对应的节点?

void traverseLeftRight(struct node *head){

    current = head;

    if(current == NULL){

        printf("There are no nodes within the list\n");
    }

    while(1){

        if(current != NULL){

            printf("left to right output:           %d\n", current -> value);
            current = current -> next;
        }else{

            free(current);
            current = NULL;
            break;
        }
    }
}

最佳答案

我认为您对内存管理感到困惑。

在您展示的示例中,不需要任何释放,因为(据我们所知)没有分配任何东西。

如果您使用 malloc(3) 或 friends 分配内存,那么您通常需要稍后释放它,恰好一次。一般来说,未能释放某些东西会泄漏内存(即,内存仍在分配,但你不再指向它,所以不能使用它),并且多次释放是一个错误(在某种意义上这打开了两个代码位都认为它们已被分配独占使用同一位内存的可能性)。在释放内存后使用一些内存(即取消引用指针)是典型的“释放后使用”错误。这些中的每一个都会导致一些难以发现的错误(但 valgrind 是你的 friend )。

第二次调用 free 不会(很遗憾)导致错误,因为 free 不会报告此类错误。

如果内存一直在使用到程序结束,则不需要释放内存 - 当程序完成时(实际上)会自动释放内存。

几乎唯一在这样的函数中调用 free 的情况是,如果您正在编写一个函数来遍历链表(或类似的东西),并在它运行时释放。列表的遍历(如您的函数名称所示)预计不会导致列表被释放。

关于c - 内存管理 C 和指针的 free(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43548016/

相关文章:

c - 编写 Tcl C 扩展共享库 [链接错误]

c - 如何从编译器获取变量的指针和大小——从编译代码之外?

c - 从字符串中分离标记时出现段错误

c++ - 为什么我可以从 char * const 值创建 char * vector ?

c - 重复调用 C 函数会导致 R - 如何分配内存?

iphone - 当我的应用收到内存警告时该怎么办?

c - 为什么在尝试使用指针将两个数字相加时出现段错误?

c++ - 编程原理与实践第27章侵入式列表错误?

c++ - AVX 循环矢量化错误

javascript - $timeout 中的 "Controllers as"语法