SGM*_*GM1 13 c memory-management
我想知道是否可以检查传递给函数的指针是否由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);
}
}
Run Code Online (Sandbox Code Playgroud)
我明白,通常你会检查是否t == NULL,但我只是想知道是否有可能看到是否已为给定指针分配内存.
不,你不能.
基本上,你不应该这样做.如果你想要写一个辅助函数来释放给定的指针一些内存,应该比你awarely和明确地动态分配的指针传递给内存某一区域这样做.
原始指针C不能传输关于它们指向的内存的额外信息.如果您想拥有此类信息,则必须传递一个包含您感兴趣的指针的附加包装器,例如:
typedef struct my_pointer
{
void *ptr;
int is_dynamically_allocated;
} ptr;
Run Code Online (Sandbox Code Playgroud)
但这将是内存/时间的巨大损失.
没有办法检查,您应该NULL初始化然后测试是否NULL确实
从第7.20.3.2节起C99标准的自由功能:
free函数使ptr指向的空间被释放,即可以用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与calloc,malloc或realloc函数先前返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则该行为是不确定的。