13

我想知道是否可以检查传递给函数的指针是否由 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);
    }
}

我知道通常您会检查 if t == NULL,但我只是想知道是否可以查看是否已为给定指针分配了内存。

4

2 回答 2

9

不,你不能。

基本上,您不需要这样做。如果您想编写一个辅助函数来释放给定指针的一些内存,那么您应该有意识明确地将动态分配的指针传递给某个内存区域来执行此操作。

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

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

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

于 2013-04-28T19:43:58.133 回答
5

没办法检查,你应该NULL初始化然后测试是否NULL确实

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

free 函数会导致 ptr 指向的空间被释放,也就是说,可用于进一步分配。如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与 calloc、malloc 或 realloc 函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。

于 2013-04-28T19:43:33.697 回答