无法发现双重免费
Can't spot double free
我尝试使用动态内存分配来初始化矩阵,为此我创建了一个辅助函数。
当我尝试释放内存时出现问题。我遇到 双重释放或损坏 错误。
我明白什么是双重释放错误,但无法在我的代码中发现它。
void
delete_matrix(matrix_t *mat)
{
for(int i = 0; i < mat->rows; i++)
{
free(mat->data[i]); /* It crashes at first iteration */
mat->data[i] = NULL;
}
free(mat->data);
mat->data = NULL;
}
int
init_matrix(matrix_t *mat, int rows, int cols)
{
mat->rows = rows;
mat->cols = cols;
mat->data = (int**)malloc(rows * sizeof(int));
for(int i = 0; i < rows; i++)
{
mat->data[i] = (int*)malloc(cols * sizeof(int));
}
return 0;
}
gdbonline.com 上的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
typedef struct
{
int ** data;
int rows;
int cols;
}matrix_t;
int init_matrix(matrix_t *mat, int rows, int cols);
void delete_matrix(matrix_t *mat);
int
main()
{
printf("> Program started\n");
matrix_t mat_A;
init_matrix(&mat_A, 1000, 1000);
delete_matrix(&mat_A);
printf("> Program done\n");
sleep(0);
return 0;
}
int
init_matrix(matrix_t *mat, int rows, int cols)
{
mat->rows = rows;
mat->cols = cols;
mat->data = (int**)malloc(rows * sizeof(int));
if(!mat->data)
{
printf("! malloc error (init_matrix 1)\n");
return -1;
}
for(int i = 0; i < rows; i++)
{
mat->data[i] = (int*)malloc(cols * sizeof(int));
if(!mat->data[i])
{
printf("! malloc error (init_matrix 2)\n");
return -1;
}
}
return 0;
}
void
delete_matrix(matrix_t *mat)
{
for(int i = 0; i < mat->rows; i++)
{
free(mat->data[i]);
mat->data[i] = NULL;
}
free(mat->data);
mat->data = NULL;
}
提前致谢。
I'm getting double free or corruption error.
由于不正确的分配可能导致损坏。
// v-v---- wrong type.
// mat->data = (int**)malloc(rows * sizeof(int));
mat->data = malloc(sizeof *(mat->data) * rows);
// ^-----------------^ The right size by construction
// No need to code the matching type
我尝试使用动态内存分配来初始化矩阵,为此我创建了一个辅助函数。 当我尝试释放内存时出现问题。我遇到 双重释放或损坏 错误。
我明白什么是双重释放错误,但无法在我的代码中发现它。
void
delete_matrix(matrix_t *mat)
{
for(int i = 0; i < mat->rows; i++)
{
free(mat->data[i]); /* It crashes at first iteration */
mat->data[i] = NULL;
}
free(mat->data);
mat->data = NULL;
}
int
init_matrix(matrix_t *mat, int rows, int cols)
{
mat->rows = rows;
mat->cols = cols;
mat->data = (int**)malloc(rows * sizeof(int));
for(int i = 0; i < rows; i++)
{
mat->data[i] = (int*)malloc(cols * sizeof(int));
}
return 0;
}
gdbonline.com 上的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
typedef struct
{
int ** data;
int rows;
int cols;
}matrix_t;
int init_matrix(matrix_t *mat, int rows, int cols);
void delete_matrix(matrix_t *mat);
int
main()
{
printf("> Program started\n");
matrix_t mat_A;
init_matrix(&mat_A, 1000, 1000);
delete_matrix(&mat_A);
printf("> Program done\n");
sleep(0);
return 0;
}
int
init_matrix(matrix_t *mat, int rows, int cols)
{
mat->rows = rows;
mat->cols = cols;
mat->data = (int**)malloc(rows * sizeof(int));
if(!mat->data)
{
printf("! malloc error (init_matrix 1)\n");
return -1;
}
for(int i = 0; i < rows; i++)
{
mat->data[i] = (int*)malloc(cols * sizeof(int));
if(!mat->data[i])
{
printf("! malloc error (init_matrix 2)\n");
return -1;
}
}
return 0;
}
void
delete_matrix(matrix_t *mat)
{
for(int i = 0; i < mat->rows; i++)
{
free(mat->data[i]);
mat->data[i] = NULL;
}
free(mat->data);
mat->data = NULL;
}
提前致谢。
I'm getting double free or corruption error.
由于不正确的分配可能导致损坏。
// v-v---- wrong type.
// mat->data = (int**)malloc(rows * sizeof(int));
mat->data = malloc(sizeof *(mat->data) * rows);
// ^-----------------^ The right size by construction
// No need to code the matching type