Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有条件无堆_C_Malloc_Conditional_Free - Fatal编程技术网

C 有条件无堆

C 有条件无堆,c,malloc,conditional,free,C,Malloc,Conditional,Free,所以,我有这种情况。一个终止处理程序和一些指向先前在堆上分配的结构的指针 我想做的是使用处理程序有选择地释放它们:对于每个指针,如果对应的结构是alloc,则必须释放。我使用一些整数(1指针->1整数)来控制每个指针状态(alloc'd或free),并确定处理程序是否必须释放 这是密码 /*HEAP STATUS GLOBAL VARIABLES (1 => free required)*/ int free_addrinfo, free_up_rcvd, free_rc_rcvd, fr

所以,我有这种情况。一个终止处理程序和一些指向先前在堆上分配的结构的指针

我想做的是使用处理程序有选择地释放它们:对于每个指针,如果对应的结构是alloc,则必须释放。我使用一些整数(1指针->1整数)来控制每个指针状态(alloc'd或free),并确定处理程序是否必须释放

这是密码

/*HEAP STATUS GLOBAL VARIABLES (1 => free required)*/
int free_addrinfo, free_up_rcvd, free_rc_rcvd, free_rc_rspn;

/*HEAP POINTERS*/
struct addrinfo *result;
USR_PSW *up_rcvd;
TBOOK_RECORD *rc_rcvd, *rc_rspn; 

void termination_handler(){
    close(sock_ds);
    close(acc_sock_ds);
    if(free_addrinfo) freeaddrinfo(result);
    if(free_up_rcvd) free(up_rcvd);
    if(free_rc_rcvd) free(rc_rcvd);
    if(free_rc_rspn) free(rc_rspn);
   _exit(EXIT_SUCCESS);
}

有更聪明的解决方案吗?提前谢谢大家

我只是在初始化时将变量设置为NULL,然后在释放变量时再次将其重置为NULL。当您已经有了一个自然指针时,没有理由保留一个单独的指示器来表示指针已初始化


实际上,实际上,我会尝试以这样一种方式编写代码,即永远不会怀疑何时需要释放指针。但是当不可能的时候,空检查就足够了。

我应该手动设置它还是
free
在指针上设置空值<代码>{/*…*/free(usr_rec);usr_rec=NULL;/*…*/}但是终止处理程序可以随时启动。我不能用任何其他方式来管理它!当然,在调用
free
之后,您必须将指针设置为
NULL
。好的,现在它看起来更优雅了!谢谢甚至不需要检查NULL。free(NULL)在C标准中保证不做任何事情,所以只要将它们全部释放,不管它们是否已分配。