在我的程序中,我使用了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;
}
我用gcc -o wow -fsanitize=address wow.c && ./wow
编译并运行它
怎么会没有内存泄漏?我是不是漏掉了什么?
更新
我第一次使用wsl (debian 10)
和fsanitize=address
进行编译和运行时,未能检测到内存泄漏
但是当我用Arch 5.19
编译和运行时,它检测到了DEADLYSIGNAL
。
1条答案
按热度按时间hsvhsicv1#
编译器不仅报告泄漏(如果程序设法避免SIGSEGV),而且报告程序表现出未定义的行为。
要修复未定义的行为,请将
与
那你就
您应该将
print2D
更改为接受const int *cols_size
而不是int **cols_size
。不需要间接寻址。