eXosip2開發過程當中應該注意的幾個問題


1、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));ui

    /* 
     * 使用www_auth相關操做... 
     */指針

    /* 使用後應釋放www_auth */
    osip_free(www_auth);                    /* 正確 */
    osip_www_authenticate_free(www_auth);   /* 錯誤 */ip


2、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);字符串


3、osip_xxx_xxx_add相關函數內部都會動態分配內存,後面必須用osip_xxx_xxx_free釋放
如:
    錯誤代碼1:
    osip_contact_t *contact = NULL;get

    osip_contact_init(&contact);string

    /* 內部會調用osip_xxx_xxx_init相關函數申請空間 */
    osip_contact_param_add(contact, "expires", "90");it

    /* 
     * 使用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);
    
4、先調用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);
    
5、有兩種方式能夠更改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);       

相關文章
相關標籤/搜索