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);
    
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章