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