RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏(转)
在使用OpenSSL的RSA加解密的时候,发现RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏。网上Baidu、Google之,发现这个相关信息很少(至少中文搜索结果是这样,不知是研究这个的人太少还是这个太基础了。。。),最后终于在某个E文论坛上找到了解决办法。在这里总结了一下,供大家参考。我的OpenSSL版本是0.9.8l。(by 月落上弦)
具体如下:
RSA * rsa = RSA_new();
RSA_free( rsa );
产生内存泄漏:
Detected memory leaks!
Dumping objects ->
{140} normal block at 0x003B97A0, 12 bytes long.
Data: < ; > B8 96 3B 00 00 00 00 00 06 00 00 00
{139} normal block at 0x003B9750, 16 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{138} normal block at 0x003B9700, 20 bytes long.
Data: < P ; > 00 00 00 00 50 97 3B 00 00 00 00 00 04 00 00 00
{137} normal block at 0x003B96B8, 12 bytes long.
Data: < ; > 06 00 00 00 00 97 3B 00 00 00 00 00
{136} normal block at 0x003B9638, 64 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{135} normal block at 0x003B9598, 96 bytes long.
Data: <8 ; A A > 38 96 3B 00 C0 FD 41 00 B0 FD 41 00 08 00 00 00
Object dump complete.
解决方法很简单:
调用OpenSSL的crypto库,在退出前需要调用API "CRYPTO_cleanup_all_ex_data",清除管理CRYPTO_EX_DATA的全局hash表中的数据,避免内存泄漏。如下:
RSA * rsa = RSA_new();
RSA_free( rsa );
CRYPTO_cleanup_all_ex_data();
这样就没有内存泄漏了。
需要注意的是,CRYPTO_cleanup_all_ex_data()不能在potential race-conditions条件在调用(不太懂这个术语,我理解的意思是当函数外部存在RSA结构体的时候,在函数内部执行CRYPTO_cleanup_all_ex_data()将导致函数外的RSA结构体也被清理掉),因此最好在程序结束的时候才调用。
关于CRYPTO_cleanup_all_ex_data()的注释说明和代码如下:
/* Release all "ex_data" state to prevent memory leaks. This can't be made
* thread-safe without overhauling a lot of stuff, and shouldn't really be
* called under potential race-conditions anyway (it's for program shutdown
* after all). */
void CRYPTO_cleanup_all_ex_data(void)
{
IMPL_CHECK
EX_IMPL(cleanup)();
}
同样,其他相应的模块也需要在使用后清理:
CONF_modules_unload(1); //for conf
EVP_cleanup(); //For EVP
ENGINE_cleanup(); //for engine
CRYPTO_cleanup_all_ex_data(); //generic
ERR_remove_state(0); //for ERR
ERR_free_strings(); //for ERR
http://www.cnblogs.com/moonset7/archive/2009/12/30/1635770.html 月落上弦
RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏(转)的更多相关文章
- 关于结构体和C++类的内存地址问题
		关于结构体和C++类的内存地址问题 今天终于有时间写点东西了~ 太爽了 *_* 很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样 ... 
- C语言中free()函数释放struct结构体中的规律
		并不是什么新鲜的事情,不过值得注意.首先我们知道,在使用struct来定义并声明一个变量时,将会自动划分出一个连续的储存空间(虽然根据某些对齐原则会出现内存间隙,但是大体上来说还是连续的)这一块连续空 ... 
- 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序
		原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ... 
- 【2016-08-18】转载:总结C++中几种结构体初始化的方法
		作者:Ac_Von 博客地址:http://www.cnblogs.com/vongang/ 文章地址:http://www.cnblogs.com/vongang/archive/2011/07/3 ... 
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
		===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ... 
- [转载] FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
		===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ... 
- C语言一维数组、二维数组、结构体的初始化
		C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ... 
- (转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)
		网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct d ... 
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
		1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ... 
随机推荐
- docker 学习(八) docker file
			一 什么是Dockerfile: Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像.它们简化了从头到尾的流程并极大的简化了部署工作.Dockerfile ... 
- 面向对象——final关键字
			继承的弊端:打破了封装性 解决方式:final final关键字的特点: 1.final是一个修饰符,即可以修饰类,也可以修饰方法,还可以修饰变量 2.final修饰的类不可以被继承 3.final修 ... 
- 基于keepalived的nginx高可用
			#nginx,keepalived安装略过 MASTER 节点配置文件(192.168.1.11) vi /etc/keepalived/keepalived.conf global_defs { # ... 
- openstack介绍(二)
			OpenStack services 本节将详细描述OpenStack服务. Compute service overview(计算服务概述) 使用OpenStack云计算计算主机和管理系统.Open ... 
- HDU - 6081 2017百度之星资格赛 度度熊的王国战略
			度度熊的王国战略 Accepts: 644 Submissions: 5880 Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 3 ... 
- Apache Shiro知识点总览
			名词解释 权限认证 授权 ini文件配置 jsp标签授权 Shiro会话机制 自定义Realm 加密.解密 特性 与spring整合 名词解释 Subject:认证主体 Reaml:认证来源[jdbc ... 
- CentOS7 环境下MySQL5.7   PHP7的安装
			用的都是最新版的包 : php7 mysql5.7 nginx1.8 zabbix3.2.6 替换源为阿里云的源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/ ... 
- Fedora下Msitools使用
			msitools学习 msitools使用 wixl-heat使用 概述 打包程序就是把程序依赖的所有库文件和可执行文件以及其他一些资源文件按照源目录结构进行压缩,知道自己的程序依赖哪些库是简单的,但 ... 
- PHP RSA算法 HMAC-SHA1加密算法
			HMAC-SHA1加密算法 function getSignature($str, $key) { $signature = ""; if (function_exists('ha ... 
- 洛谷P1578 奶牛浴场
			P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ... 
