C中是如何发生内存泄漏的?

How does memory leakage occur in C?

我很难想象泄漏是如何发生的。我们得到了这段代码,它可以被编译 运行 但它会泄漏内存。 “程序是怎么泄漏内存的?画出来解释一下。”

#include <stdlib.h>

struct nod {
    char name[30];
    int tel;
    struct nod * next;
    struct nod * prev;
};
typedef struct nod Nod;

int main() {
    Nod * p =  malloc(sizeof(Nod));
    p -> next =  malloc(sizeof(Nod));
    p -> next -> prev = p;
    free(p);
}
    Nod * p =  malloc(sizeof(Nod));
    p -> next =  malloc(sizeof(Nod));
    p -> next -> prev = p;
    free(p);

p 被释放时,引用 p->next 丢失。所以程序不能freep -> next = malloc(sizeof(Nod));分配的内存。

实际上,程序是无法释放内存的。如果经常发生这种情况,进程使用的内存会慢慢增加。如果进程使用过多内存,系统将启动 swap 并且计算机性能将显着下降。

程序valgrind可以帮助您检测内存泄漏。

如果您使用的是最新版本的 GCC 编译器,您可以使用清理标志来检测内存泄漏

gcc test.c -o test -fsanitize=address -fno-omit-frame-pointer

当你 运行 程序时,你会得到类似

的输出
=================================================================
==2356059==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 56 byte(s) in 1 object(s) allocated from:
#0 0x7fad5bc6b459 in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cpp:145
#1 0x55b353e65198 in main (/home/xxx/xxx/test+0x1198)
#2 0x7fad5ba18151 in __libc_start_main (/usr/lib/libc.so.6+0x28151)

SUMMARY: AddressSanitizer: 56 byte(s) leaked in 1 allocation(s).