首页
社区
课程
招聘
[求助]MultiByteToWideChar引起free内存崩溃问题
发表于: 2016-3-7 20:37 4703

[求助]MultiByteToWideChar引起free内存崩溃问题

2016-3-7 20:37
4703
这段代码我知道有问题,改成:pwText = (wchar_t *)malloc( dwUnicodeLen * sizeof( wchar_t )  ); 就正常了,但是不知道深层的原因,malloc的内存管理信息记录在当前申请地址的前面,我调试发现也没有被修改,但是一到free就崩溃了,注释掉第二个MultiByteToWideChar就不会有问题,搞不明白这个函数干了什么,麻烦大家指导下~  

int UTF8ToUnicode( const char* UTF8, wchar_t * strUnicode, int nDstBufLen )
{
  wchar_t * pwText = NULL;
  DWORD dwUnicodeLen = 0;
  dwUnicodeLen = MultiByteToWideChar( CP_UTF8, 0, UTF8, -1, NULL, 0 );
  pwText = (wchar_t *)malloc( dwUnicodeLen  );
  if ( !pwText )
    return 0;

  MultiByteToWideChar( CP_UTF8, 0, UTF8, -1, pwText, dwUnicodeLen);
  wcscpy_s( strUnicode, nDstBufLen, pwText );
  free( pwText );
  return 1;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
char* UTF8 是单字节 字符串
wchar_t * strUnicode 是双字节字符串

单 和 双 之间的差别 在于倍数

* sizeof( wchar_t )
==> 乘于 2
2016-3-7 22:09
0
雪    币: 25
活跃值: (170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
pwText = (wchar_t *)malloc( dwUnicodeLen * sizeof( wchar_t )  + 1);
2016-3-8 10:00
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不好意思,你们可能没明白我的意思。。。


void * p = malloc( 10 );
  if ( !p )
     return 0;

  char * s = "hello 1234567890";
  int nLen = strlen( s );
  memcpy( p, s, nLen );
  free( p );



像这样往后覆盖几个字节的内存是不会崩溃的,因为malloc申请的内存信息记录在前面,上面那个虽然也是长度不够,往后覆盖,但是百分百就free崩溃,我想知道MultiByteToWideChar到底干了什么影响到了?
2016-3-8 11:05
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不用加1的,MultiByteToWideChar得到的长度是包含结束符的长度
2016-3-8 11:11
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
6
动态调试看内存应该能解决你的问题吧。。。。
2016-3-8 11:31
0
雪    币: 358
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
malloc分配的空间是字节为单位的,需要*2,也就是dwUnicodeLen * sizeof( wchar_t )
2016-3-8 11:34
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看4楼
2016-3-8 13:51
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
调过了。。 malloc 后 pwText = 0x00976188,MultiByteToWideChar后只改变了8个字节的内容,虽然往后多覆盖了4个字节,但是free为嘛会崩溃,,,,前面的内存管理信息没变过,大小也是对的
上传的附件:
2016-3-8 13:56
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
10
堆申请的的字节数和释放字节数要一致。
2016-3-8 14:38
0
雪    币: 775
活跃值: (3420)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
11
这个需要了解堆的一些结构了。我跟到HeapValidate这里出错,里面的就没跟了,你想知道为什么的话,就跟一下。
大概原理我猜是malloc申请的内存是一个_CrtMemBlockHeader结构,每次申请的结构组成一个链表,你溢出的话覆盖了一些东西,导致校验链表或者_CrtMemBlockHeader结构失败,于是报错
2016-3-8 15:59
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
有可能,对堆结构还不熟悉。。。我看看
2016-3-9 11:00
0
游客
登录 | 注册 方可回帖
返回
//