memset导致的内存泄露问题的解决办法

 

 
  
1 #ifdef UNICODE
2 #ifndef TSTRING
3 #define TSTRING std::wstring
4 #endif
5   #else
6 #ifndef TSTRING
7 #define TSTRING std::string
8 #endif
9   #endif
10
11   #define MAX_OBJ_NUM 10
12
13   struct Object
14 {
15 UINT id;
16 TSTRING strIconPath;
17 TSTRING strAppPath;
18 };
19
20 Object obj[MAX_OBJ_NUM ];
21
22   void InitObject(Object& obj )
23 {
24 memset( & Obj[ 0 ], 0 , sizeof (Object) * MAX_OBJ_NUM );
25 }

调用InitObject()的时候会有内存泄露发生,很是郁闷,我只是0初始化了呀。

经查证,发现是对字符串清零时出的问题。

原因如下:string/wstring是C++标准库的类,而用memset来对包含有指针的类对象的结构体清0是非常危险的,该清0操作导致string/wstring的内部结构遭到破坏,已经申请到的内存得不到释放,因而导致内存泄露。

解决办法:

 

 
  
1 // 笨方法,逐一清0
2 void InitObject(Object & obj)
3 {
4 for ( int i = 0 ; i < MAX_OBJ_NUM; i ++ )
5 {
6 obj[i].id = 0 ;
7 obj[i].strIconPath.clear();
8 obj[i].strAppPath.clear();
9 }
10 }

 

 

 

转载于:https://www.cnblogs.com/brucedeen/archive/2010/06/26/1765913.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值