为什么这一句delete[] szBuf 执行时会报错?

ynduanlian 2010-02-11 01:19:43
从网上找了段把中文大五码转为GBK字符的代码:

void __fastcall BIG52GBK(char *szBuf)
{
if(!strcmp(szBuf,"")) return;
int iLen=MultiByteToWideChar (950, 0, szBuf, -1, NULL,0) ;
wchar_t *pws=new wchar_t[iLen+1];
int nReturn = MultiByteToWideChar(950, 0, szBuf, -1, pws, iLen + 1);

iLen=WideCharToMultiByte(936, 0, pws, -1, NULL, 0, NULL, NULL);
// delete[] szBuf;
szBuf=new char[iLen+1];
WideCharToMultiByte(936, 0, pws, -1, szBuf, iLen, NULL, NULL);
delete[] pws;
}

奇怪的是,如果我把 // delete[] szBuf 的注释取消掉,执行程序时就会报错,这个非常难让人理解,难道new 分配了内存,不是应当delete掉再重新分配吗?

帮助里说:
You should use the delete operator to remove all memory that has been allocated by the new operator. Failure to free memory can result in memory leaks.
...全文
113 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Maconel 2010-02-13
  • 打赏
  • 举报
回复
请参看《c++高质量编程》,里边专门讲了这个问题。
这不是什么大部头的书,只是篇文章而已,网上很容易找得到。
ynduanlian 2010-02-11
  • 打赏
  • 举报
回复
引用 4 楼 maconel 的回复:
szBuf是一个传值参数,函数内改变它,函数外还是老的值。这一点,可以看下《c++高质量编程》。

一般来说分配内存,应该谁分配谁释放,看你这个函数,似乎是想第一次在函数外分配内存,函数内释放并重新分配,最后在函数外释放,真是太混乱了。

太惭愧了,我想要实现的目的是传给来一个字符串,然后修改字符串的内容,再传出去,也就是想实现传地址的效果,请指点以一下怎么写才好.
Maconel 2010-02-11
  • 打赏
  • 举报
回复
szBuf是一个传值参数,函数内改变它,函数外还是老的值。这一点,可以看下《c++高质量编程》。

一般来说分配内存,应该谁分配谁释放,看你这个函数,似乎是想第一次在函数外分配内存,函数内释放并重新分配,最后在函数外释放,真是太混乱了。
ydlchina 2010-02-11
  • 打赏
  • 举报
回复
这个是个参数,没必要在函数体内delete,如果人家给个数组,如果你delete那不就错了.
ydlchina 2010-02-11
  • 打赏
  • 举报
回复
// delete[] szBuf;
szBuf=new char[iLen+1];

这两句是否应该颠倒,使用就正确了
ynduanlian 2010-02-11
  • 打赏
  • 举报
回复
从网上找了段把中文大五码转为GBK字符的代码:
void __fastcall BIG52GBK(char *szBuf)
{
if(!strcmp(szBuf,"")) return;
int iLen=MultiByteToWideChar (950, 0, szBuf, -1, NULL,0) ;
wchar_t *pws=new wchar_t[iLen+1];
int nReturn = MultiByteToWideChar(950, 0, szBuf, -1, pws, iLen + 1);

iLen=WideCharToMultiByte(936, 0, pws, -1, NULL, 0, NULL, NULL);
// delete[] szBuf;
szBuf=new char[iLen+1];
WideCharToMultiByte(936, 0, pws, -1, szBuf, iLen, NULL, NULL);
delete[] pws;
}

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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