如何在使用 malloc 后释放 NULL 指针
How to free NULL pointer after using malloc
例如,我有下面的代码来计算指针的大小(在这种情况下就像一个数组):
#include <stdio.h>
#include <stdlib.h>
int **ptr;
void init() {
ptr = malloc(sizeof(int *)*5);
if(!ptr){
printf("cannot malloc, \n");
return;
}
for(int i =0; i < 5; i++) {
ptr[i] = malloc(sizeof(int));
if(!ptr[i]){
printf("cannot malloc, ptr[%d]\n", i);
return;
}
}
ptr[4] = NULL;
}
int main(void) {
init();
int count = 0;
while(ptr[count] != NULL) {
count++;
}
printf("size of ptr = %d\n", count);
}
想法:
在init()
函数中的数组的and处添加NULL指针,然后使用while
循环通过增加count
来计算大小,直到遇到NULL指针。 这是个坏主意吗?
问题;
据我所知,对于 free(pointer)
函数,如果 pointer
为 NULL,则不会发生任何事情。那么,如何释放ptr[4]
?
我尝试释放这个指针:
for(int i =0; i < 5; i++) {
free(ptr[i]);
}
free(ptr);
然后通过Valgrind验证
==2957== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2957== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2957== by 0x108775: init (test2.c:12)
==2957== by 0x1087E1: main (test2.c:22)
==2957==
==2957== LEAK SUMMARY:
==2957== definitely lost: 4 bytes in 1 blocks
==2957== indirectly lost: 0 bytes in 0 blocks
==2957== possibly lost: 0 bytes in 0 blocks
==2957== still reachable: 0 bytes in 0 blocks
==2957== suppressed: 0 bytes in 0 blocks
我可以尝试的一件事是使用 realloc
(我知道 realloc(PTR, 0)
不等同于 free(PTR)
):
ptr[4] = realloc(ptr[4], 0);
但是我用Valgrind测试的时候还是有内存泄漏。
您 malloc 一些内存,将该值存储在 ptr[4]
中,然后用 NULL
覆盖 ptr[4]
。这是您发生内存泄漏的地方。之后你做什么都无法恢复丢失的记忆。
您需要在 4(而不是 5)处停止循环。
例如,我有下面的代码来计算指针的大小(在这种情况下就像一个数组):
#include <stdio.h>
#include <stdlib.h>
int **ptr;
void init() {
ptr = malloc(sizeof(int *)*5);
if(!ptr){
printf("cannot malloc, \n");
return;
}
for(int i =0; i < 5; i++) {
ptr[i] = malloc(sizeof(int));
if(!ptr[i]){
printf("cannot malloc, ptr[%d]\n", i);
return;
}
}
ptr[4] = NULL;
}
int main(void) {
init();
int count = 0;
while(ptr[count] != NULL) {
count++;
}
printf("size of ptr = %d\n", count);
}
想法:
在init()
函数中的数组的and处添加NULL指针,然后使用while
循环通过增加count
来计算大小,直到遇到NULL指针。 这是个坏主意吗?
问题;
据我所知,对于 free(pointer)
函数,如果 pointer
为 NULL,则不会发生任何事情。那么,如何释放ptr[4]
?
我尝试释放这个指针:
for(int i =0; i < 5; i++) {
free(ptr[i]);
}
free(ptr);
然后通过Valgrind验证
==2957== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2957== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2957== by 0x108775: init (test2.c:12)
==2957== by 0x1087E1: main (test2.c:22)
==2957==
==2957== LEAK SUMMARY:
==2957== definitely lost: 4 bytes in 1 blocks
==2957== indirectly lost: 0 bytes in 0 blocks
==2957== possibly lost: 0 bytes in 0 blocks
==2957== still reachable: 0 bytes in 0 blocks
==2957== suppressed: 0 bytes in 0 blocks
我可以尝试的一件事是使用 realloc
(我知道 realloc(PTR, 0)
不等同于 free(PTR)
):
ptr[4] = realloc(ptr[4], 0);
但是我用Valgrind测试的时候还是有内存泄漏。
您 malloc 一些内存,将该值存储在 ptr[4]
中,然后用 NULL
覆盖 ptr[4]
。这是您发生内存泄漏的地方。之后你做什么都无法恢复丢失的记忆。
您需要在 4(而不是 5)处停止循环。