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
丢失。所以程序不能free
由p -> 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).
我很难想象泄漏是如何发生的。我们得到了这段代码,它可以被编译 运行 但它会泄漏内存。 “程序是怎么泄漏内存的?画出来解释一下。”
#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
丢失。所以程序不能free
由p -> 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).