case 'd': //delete
ret = parse_get_username(path, &user_name);
ret_v = parse_get_validity(path, &uid_validity);
if(ret == TRUE){
if(ret_v == TRUE){
sprintf(sync_buf, "%s %s %s %s .%s\n", ttime, user_name, cmd, uid_validity, objectname);
free(uid_validity);
}else{
sprintf(sync_buf, "%s %s %s .%s\n", ttime, user_name, cmd, objectname);
}
ret = write(sync_fd, sync_buf, strlen(sync_buf));
if(ret <= 0){
sync_buf[strlen(sync_buf)-1] = '\0';
i_error("### sync_opmail.log write error! [cmd:delete args:%s]###",sync_buf);
}
free(user_name);
}
break;
这段函数中加粗部分:
开辟地址返回数据后sprintf格式化输出到变量sync_buf中就free掉uid_validity这个变量了,这没有影响后面的write对这段数据的操作。可以直接打印出sync_log的首位地址和uid_validity变量的地址,这两个地址是不相关的,也就是说:sprintf是一个拷贝过程。所以free是没有问题的。