c-在创建2d数组时,在哪里释放内存?valgrind错误



我开始学习动态内存分配。在这段代码中,我在main函数中创建了2d数组:

int r, c;
scanf("%d %dn", &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 returs:

==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((,但在检查了其他答案后,我不知道我的错误在哪里,如果使用,请在程序的其余部分使用此表。我将感谢你的提示和解释。`

当您调用int **board = malloc(row * sizeof(*board));时,系统将为您分配row * sizeof(*board)字节的内存,然后返回一个指向该内存起点的指针(即内存地址(,您将该指针存储在名为boardint **变量中。

当你的程序完成时,系统会回收内存,所以如果你的程序寿命很短,这可能无关紧要,但养成释放内存的习惯是一个很好的做法,因为在你的程序退出之前,它根本不会回收任何内存,除非你告诉它

因此,您应该始终调用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);

最新更新