创建二维数组时在哪里释放内存? valgrind 错误
Where to free memory, while creating 2d array? valgrind error
我开始学习动态内存分配。在这段代码中,我在 main 函数中创建了二维数组:
int r, c;
scanf("%d %d\n", &r, &c);
size_t row = (size_t) r;
size_t col = (size_t) c;
int **board = malloc(row * sizeof(*board));
for (int i = 0; i < r; i++) {
board[i] = malloc(col * sizeof(*board[i]));
}
(我需要 int 和 size_t 因为 for 循环,尤其是当 r>=0 时,这对 size_t 总是正确的)。
那我换个其他功能的板子。 Valgrind 返回:
==59075== 364 (56 direct, 308 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==59075== at 0x483577F: malloc (vg_replace_malloc.c:299)
==59075== by 0x10B4DB: main (name22.c:122)
==59075==
122行是:
int **board = malloc(row*sizeof( *board));
我想我必须使用 free(),但是在检查了我不知道的其他答案之后,我的错误在哪里以及将 free() 放在哪里,如果使用,请在其余部分使用此 table的程序。感谢您的提示和解释。
`
当您调用 int **board = malloc(row * sizeof(*board));
时,系统会为您分配 row * sizeof(*board)
字节的内存,然后 return 指向该内存开始的指针(即 - 内存地址),您将其存储在名为 board
.
的 int **
变量中
当你的程序结束时,系统会回收那部分内存,所以如果你的程序是短暂的,这可能并不重要,但养成释放内存的习惯是个好习惯,因为它会在您的程序退出之前,根本不回收任何内存,除非您告诉它。
出于这个原因,您应该始终调用 free(...)
,传入您第一次调用 malloc(...)
时获得的内存地址,一旦您完成了该内存。在 大多数 情况下,对 malloc(...)
的每次调用都应该对 free(...)
进行相等且相反的调用
这很重要,因为您的系统内存有限。如果您的程序正在请求资源,然后在完成后从不归还它们,您最终会 运行 内存不足 - 这就是所谓的“内存泄漏”。
所以对你来说,正确调用 free(...)
看起来像这样:
int **board = malloc(row * sizeof(*board));
for (int i = 0; i < r; i++) {
board[i] = malloc(col * sizeof(*board[i]));
}
// Do something with board
for (int i = 0; i < r; i++) {
free(board[i]);
}
free(board);
我开始学习动态内存分配。在这段代码中,我在 main 函数中创建了二维数组:
int r, c;
scanf("%d %d\n", &r, &c);
size_t row = (size_t) r;
size_t col = (size_t) c;
int **board = malloc(row * sizeof(*board));
for (int i = 0; i < r; i++) {
board[i] = malloc(col * sizeof(*board[i]));
}
(我需要 int 和 size_t 因为 for 循环,尤其是当 r>=0 时,这对 size_t 总是正确的)。
那我换个其他功能的板子。 Valgrind 返回:
==59075== 364 (56 direct, 308 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==59075== at 0x483577F: malloc (vg_replace_malloc.c:299)
==59075== by 0x10B4DB: main (name22.c:122)
==59075==
122行是:
int **board = malloc(row*sizeof( *board));
我想我必须使用 free(),但是在检查了我不知道的其他答案之后,我的错误在哪里以及将 free() 放在哪里,如果使用,请在其余部分使用此 table的程序。感谢您的提示和解释。 `
当您调用 int **board = malloc(row * sizeof(*board));
时,系统会为您分配 row * sizeof(*board)
字节的内存,然后 return 指向该内存开始的指针(即 - 内存地址),您将其存储在名为 board
.
int **
变量中
当你的程序结束时,系统会回收那部分内存,所以如果你的程序是短暂的,这可能并不重要,但养成释放内存的习惯是个好习惯,因为它会在您的程序退出之前,根本不回收任何内存,除非您告诉它。
出于这个原因,您应该始终调用 free(...)
,传入您第一次调用 malloc(...)
时获得的内存地址,一旦您完成了该内存。在 大多数 情况下,对 malloc(...)
的每次调用都应该对 free(...)
这很重要,因为您的系统内存有限。如果您的程序正在请求资源,然后在完成后从不归还它们,您最终会 运行 内存不足 - 这就是所谓的“内存泄漏”。
所以对你来说,正确调用 free(...)
看起来像这样:
int **board = malloc(row * sizeof(*board));
for (int i = 0; i < r; i++) {
board[i] = malloc(col * sizeof(*board[i]));
}
// Do something with board
for (int i = 0; i < r; i++) {
free(board[i]);
}
free(board);