您的位置:首页 > 其它

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

2017-02-28 00:00 671 查看
一、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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: