释放堆指针报错的问题

wuxiao0313 2009-01-09 11:07:18

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize) //单字符转宽字符
{
// Get the required size of the buffer that receives the Unicode
// string.
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);

if(dwSize < dwMinSize)
{
return FALSE;
}


// Convert headers from ASCII to Unicode.
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
return TRUE;
}
void main()
{
char * buf = "adad哈哈哈";
wchar_t *str = NULL;
str = (wchar_t *)malloc(11);

MByteToWChar(buf, str, 11);

free(str);

printf("%s\n", buf);

}


以上代码用malloc申请free释放会报错 而换成new 和 delete [] 就正常
为什么会这样呢?
...全文
117 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wocow3 2009-01-09
  • 打赏
  • 举报
回复
怎么new的
wocow3 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuxiao0313 的回复:]
引用 1 楼 wocow3 的回复:
很明显溢出了
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
-1调用会添加0
缓冲区11字节
"adad哈哈哈"需要8个宽字符16字节

MByteToWChar中判断失效8 <11



已经解决了
内存给小了

但是不是你说的判断失效 因为第一次调用的时候返回的是下标个数

为什么delete不报错?
[/Quote]
你设计的MByteToWChar不就是想dwSize不足返回FALSE么
但事实上第一次计算dwMinSize 是按宽字符计数的8 按字节计算就是16
而你传入的dwSize 是按字节计算的11
这里理因返回FALSE
但是if(dwSize < dwMinSize)的时候没有考虑到,dwMinSize应该X2
wutaihua 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuxiao0313 的回复:]
引用 1 楼 wocow3 的回复:
很明显溢出了
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
-1调用会添加0
缓冲区11字节
"adad哈哈哈"需要8个宽字符16字节

MByteToWChar中判断失效8 <11



已经解决了
内存给小了

但是不是你说的判断失效 因为第一次调用的时候返回的是下标个数

为什么delete不报错?
[/Quote]

MALLOC 和new的逻辑是一样的,但是他们也有差别

MALLOC 和new出来的内存其实都是大于你所申请的内存的,因为他们两个都会在内存的前面加上他们自己对内存的管理信息,假设你申请10个内存,他会给你24个,前14个会是他自己保存的信息,后10个的头指针才会返回给你。但是他们给的大小却是不固定的。这就是你为什么内存申请小了,但是却没有报错的原因。

但是free的时候,由于MALLOC 和new采用的管理信息的标识是不一样的,这就导致了MALLOC 的信息已经是过期的了,而new出来的可delete掉,也是运气成分,就是你超的不够多,不然越界很大的话,也是会挂掉的。
wuxiao0313 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wocow3 的回复:]
很明显溢出了
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
-1调用会添加0
缓冲区11字节
"adad哈哈哈"需要8个宽字符16字节

MByteToWChar中判断失效8 <11

[/Quote]

已经解决了
内存给小了

但是不是你说的判断失效 因为第一次调用的时候返回的是下标个数

为什么delete不报错?
wocow3 2009-01-09
  • 打赏
  • 举报
回复
很明显溢出了
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
-1调用会添加0
缓冲区11字节
"adad哈哈哈"需要8个宽字符16字节

MByteToWChar中判断失效8<11
wuxiao0313 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wocow3 的回复:]

你设计的MByteToWChar不就是想dwSize不足返回FALS…
[/Quote]

我给了10个wchar_t下标 却只给我10个字节内存。。
wuxiao0313 2009-01-09
  • 打赏
  • 举报
回复
用new用习惯了 new是给的下标数 malloc给字节。。。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧