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