eXosip2开发过程中应该注意的几个问题


一、osip_xxx_init()相关函数内部会分配一个xxx的结构体,但xxx结构体字段空间没有分配,所以后面只能调用osip_free()释放,而不能调用osip_xxx_free()释放
如:
    osip_www_authenticate_t *www_auth;

    osip_www_authenticate_init (&www_auth);
    osip_www_authenticate_set_auth_type(www_auth, osip_strdup("Digest"));
    osip_www_authenticate_set_algorithm_MD5(www_auth);
    osip_www_authenticate_set_realm(www_auth, osip_strdup(realm));

    /* 
     * 使用www_auth相关操作... 
     */

    /* 使用后应释放www_auth */
    osip_free(www_auth);                    /* 正确 */
    osip_www_authenticate_free(www_auth);   /* 错误 */


二、osip_xxx_to_str()相关函数内部分动态分配空间,使用后记录调用osip_free()释放空间
如:

    char *str_www_auth = NULL;
    osip_www_authenticate_to_str(www_auth, &str_www_auth);
    osip_free(str_www_auth);


三、osip_xxx_xxx_add相关函数内部都会动态分配内存,后面必须用osip_xxx_xxx_free释放
如:
    错误代码1:
    osip_contact_t *contact = NULL;

    osip_contact_init(&contact);

    /* 内部会调用osip_xxx_xxx_init相关函数申请空间 */
    osip_contact_param_add(contact, "expires", "90");

    /* 
     * 使用contact相关操作... 
     */

    /* 这里没有深层释放空间,会导致内存泄漏*/
    osip_free(contact);


    正确代码2:
    osip_contact_t *contact = NULL;

    osip_contact_init(&contact);
    osip_contact_param_add(contact, osip_strdup("expires"), osip_strdup("90"));

    /* 
     * 使用contact相关操作... 
     */

    osip_contact_free(contact);
    
四、先调用eXosip_xxx_build_xxx函数内部生成,然后再调用eXosip_xxx_send_xxx函数的osip_message_t消息结构,会由eXosip_execute定时释放,不需要外部手动释放,而没有调用eXosip_xxx_send_xxx的需要主动释放
如:
    osip_message_t *request = NULL;

    eXosip_call_build_info(m_eXosip_context, s32DialogId, &request);
    osip_call_id_t *call_id = osip_message_get_call_id (request);
    string strCallID        = osip_call_id_get_number(call_id);
    osip_message_free(request);
    
    eXosip_call_terminate (m_eXosip_context, s32CallId, s32DialogId);
    
五、有两种方式可以更改eXosip_xxx_build_xxx系列函数内部生成的osip_message_t消息头域
如:
    方法1:
    osip_www_authenticate_t *www_auth;

    osip_www_authenticate_init (&www_auth);
    osip_www_authenticate_set_auth_type(www_auth, osip_strdup("Digest"));
    osip_www_authenticate_set_algorithm_MD5(www_auth);
    osip_www_authenticate_set_realm(www_auth, osip_strdup(realm));

    /* 直接将成生的www_auth指针空间加入到消息头中 */
    osip_list_add(&answer->www_authenticates, www_auth, -1);

    方法2:
    osip_www_authenticate_t *www_auth;

    osip_www_authenticate_init (&www_auth);
    osip_www_authenticate_set_auth_type(www_auth, osip_strdup("Digest"));
    osip_www_authenticate_set_algorithm_MD5(www_auth);
    osip_www_authenticate_set_realm(www_auth, 先osip_strdup(realm));

    /* 先调用osip_xxx_to_str转化为对应的字符串,然后再调用osip_message_set_xxx更改头域, osip_message_set_xxx内部会分配空间 */
    char *str_www_auth = NULL;
    osip_www_authenticate_to_str(www_auth, &str_www_auth);
    osip_message_set_www_authenticate(answer, str_www_auth);

    /* 注意释放空间 */
    osip_free(str_www_auth);
    osip_www_authenticate_free(www_auth);
    
 

猜你喜欢

转载自my.oschina.net/u/1988725/blog/848058