首页 文章

我可以检查指针是否由malloc / calloc / realloc分配? [重复]

提问于
浏览
12

这个问题在这里已有答案:

我想知道是否可以检查传递给函数的指针是否由malloc / calloc / realloc分配?

int main(){
    struct something o;
    struct something *a;
    a = malloc(sizeof(struct something));
    freeSome(&o);/*This would normally throw an (corruption?) error*/
    freeSome(a);/*This is fine*/
}

void freeSome(struct something * t){
    if (/*expression here*/){
        free(t);
    }
}

我明白,通常你会检查是否 t == NULL ,但我只是想知道是否有可能看到是否已为给定指针分配了内存 .

2 回答

  • 4

    不,你不能 .

    基本上,你不应该这样做 . 如果你想编写一个辅助函数来释放给定指针的内存,那么你应该明确地并且明确地将动态分配的指针传递给某个特定的内存区域来执行此操作 .

    C 中的原始指针无法传输有关它们指向的内存的额外信息 . 如果您想拥有此类信息,则必须传递一个包含您感兴趣的指针的附加包装器,例如:

    typedef struct my_pointer
    {
       void  *ptr;
       int   is_dynamically_allocated;
    }  ptr;
    

    但这将是内存/时间的巨大损失 .

  • 8

    无法检查,你应该 NULL 初始化,然后测试 NULL 确实

    从第7.20.3.2节开始,C99标准的自由功能:

    free函数导致ptr指向的空间被释放,即可用于进一步分配 . 如果ptr是空指针,则不执行任何操作 . 否则,如果参数与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义 .

相关问题