alt*_*r00 0 c malloc free gcc address-sanitizer
在我的程序中,我使用了malloc()和 指针,但我没有用来free()释放这些内存,我已经使用-fsanitize=address标志进行了编译,但它说没有内存泄漏。据我所知,如果我分配内存,我还必须在程序结束时释放内存,否则会出现内存泄漏。
#include <stdio.h>
#include <stdlib.h>
void print2D(int rowSize, int **cols_size, int **arr) {
for(int i = 0; i < rowSize; i++) {
for(int j = 0; j < (*cols_size)[i]; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int** make2D(int rowSize, int **colSize) {
int** arr = (int**) malloc(sizeof(int*) * rowSize);
for(int i=0; i < rowSize; i++) {
arr[i] = (int*) malloc(sizeof(int) * 2);
}
*colSize = (int*) malloc(sizeof(int*) * 2);
(*colSize)[0] = 2;
(*colSize)[1] = 2;
arr[0][0] = 1;
arr[0][1] = 2;
arr[1][0] = 3;
arr[1][1] = 4;
return arr;
}
int main() {
int **colSize;
int rowSize = 2;
int** arr = make2D(rowSize, colSize);
print2D(rowSize, colSize, arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译并运行它gcc -o wow -fsanitize=address wow.c && ./wow
怎样才不会出现内存泄漏呢?我错过了什么吗?
我第一次编译并运行使用wsl (debian 10)并fsanitize=address未能检测到内存泄漏
但是当我编译并运行时Arch 5.19检测到它DEADLYSIGNAL。这是为什么呢?
编译器不仅会报告泄漏(如果程序设法避免 SIGSEGV),还会报告您的程序表现出未定义的行为。
\n$ gcc -Wall -Wextra -pedantic -fsanitize=address a.c -o a && ./a\na.c: In function \xe2\x80\x98main\xe2\x80\x99:\na.c:42:17: warning: \xe2\x80\x98colSize\xe2\x80\x99 is used uninitialized in this function [-Wuninitialized]\n 42 | int** arr = make2D(rowSize, colSize);\n | ^~~~~~~~~~~~~~~~~~~~~~~~\n1 2\n3 4\n\n=================================================================\n==187==ERROR: LeakSanitizer: detected memory leaks\n\nDirect leak of 16 byte(s) in 1 object(s) allocated from:\n #0 0x7fda63d72808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144\n #1 0x5594afb0c407 in make2D (/tmp/ikegami/a/a+0x1407)\n #2 0x5594afb0c6d6 in main (/tmp/ikegami/a/a+0x16d6)\n #3 0x7fda63a97082 in __libc_start_main ../csu/libc-start.c:308\n\nIndirect leak of 16 byte(s) in 2 object(s) allocated from:\n #0 0x7fda63d72808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144\n #1 0x5594afb0c433 in make2D (/tmp/ikegami/a/a+0x1433)\n #2 0x5594afb0c6d6 in main (/tmp/ikegami/a/a+0x16d6)\n #3 0x7fda63a97082 in __libc_start_main ../csu/libc-start.c:308\n\nSUMMARY: AddressSanitizer: 32 byte(s) leaked in 3 allocation(s).\nRun Code Online (Sandbox Code Playgroud)\n要修复未定义的行为,请替换
\nint **colSize;\nint rowSize = 2;\n\nint** arr = make2D(rowSize, colSize);\n\nprint2D(rowSize, colSize, arr);\nRun Code Online (Sandbox Code Playgroud)\n和
\nint *colSize;\nint rowSize = 2;\n\nint** arr = make2D(rowSize, &colSize);\n\nprint2D(rowSize, &colSize, arr);\nRun Code Online (Sandbox Code Playgroud)\n然后你得到
\n$ gcc -Wall -Wextra -pedantic -fsanitize=address a.c -o a && ./a\n1 2\n3 4\n\n=================================================================\n==249==ERROR: LeakSanitizer: detected memory leaks\n\nDirect leak of 16 byte(s) in 1 object(s) allocated from:\n #0 0x7fd485c86808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144\n #1 0x55e3c49a8447 in make2D (/tmp/ikegami/a/a+0x1447)\n #2 0x55e3c49a8797 in main (/tmp/ikegami/a/a+0x1797)\n #3 0x7fd4859ab082 in __libc_start_main ../csu/libc-start.c:308\n\nDirect leak of 16 byte(s) in 1 object(s) allocated from:\n #0 0x7fd485c86808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144\n #1 0x55e3c49a84af in make2D (/tmp/ikegami/a/a+0x14af)\n #2 0x55e3c49a8797 in main (/tmp/ikegami/a/a+0x1797)\n #3 0x7fd4859ab082 in __libc_start_main ../csu/libc-start.c:308\n\nIndirect leak of 16 byte(s) in 2 object(s) allocated from:\n #0 0x7fd485c86808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144\n #1 0x55e3c49a8473 in make2D (/tmp/ikegami/a/a+0x1473)\n #2 0x55e3c49a8797 in main (/tmp/ikegami/a/a+0x1797)\n #3 0x7fd4859ab082 in __libc_start_main ../csu/libc-start.c:308\n\nSUMMARY: AddressSanitizer: 48 byte(s) leaked in 4 allocation(s).\nRun Code Online (Sandbox Code Playgroud)\n您应该更改print2D为 takeconst int *cols_size而不是int **cols_size. 不需要间接。