【问题标题】:How to free NULL pointer after using malloc使用 malloc 后如何释放 NULL 指针
【发布时间】:2020-08-08 10:40:03
【问题描述】:

例如,我有下面的代码来计算指针的大小(在这种情况下就像一个数组):

#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()函数的数组的和处添加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 测试时仍然存在内存泄漏。

【问题讨论】:

    标签: c pointers memory-leaks null free


    【解决方案1】:

    您分配一些内存,将该值存储在ptr[4] 中,然后用NULL 覆盖ptr[4]。这是发生内存泄漏的地方。之后你再做什么都无法恢复丢失的记忆。

    您需要在 4(而不是 5)处停止循环。

    【讨论】:

    • 我会用 ptr[0,1, 2, 3], ptr[4] = NULL 做某事只是为了停止 while 循环
    • 我明白这里为什么会出现内存泄漏。我只想知道如何释放 ptr[4] 的内存。有了你的回答,我可以假设释放指针没什么可做的,对吧?
    • @Hitokiri 因为没有分配内存,所以没有什么可以释放内存。
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2016-05-08
    • 2016-03-01
    • 2017-02-25
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多