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);
如:
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);
相关文章推荐
- 程序员在开发过程中应该注意的几个问题[转载]
- c++开发中的应该注意的几个问题
- 在Ubuntu上进行Android开发时, 搭建环境应该注意的几个问题
- 在android开发中应该如何管理内存或者是在开发过程中应该注意哪些问题来较少OOM?
- 谈谈报表开发应该注意的几个问题——part 1
- 谈谈报表开发应该注意的几个问题——part 3
- FPGA综合过程中应该注意的几个代码风格的问题
- 谈谈报表开发应该注意的几个问题——part 2
- 个人认为软件开发工程师应该注意的几个问题
- Java和jsp编程中应该注意的几个常见问题
- web开发过程中要注意的问题
- 在struts开发中使用validator验证时应该注意的基本问题
- web开发过程中要注意的问题
- IT职业应该注意的几个问题
- 软件开发过程中的几个问题
- 使用prototype.js 的时候应该特别注意的几个问题.
- 使用存储过程中应该注意的问题(原创)
- web开发过程中要注意的问题收集
- web开发过程中要注意的问题