为什么这一句delete[] szBuf 执行时会报错? - C++ Builder / Windows SDK/API
从网上找了段把中文大五码转为GBK字符的代码:
- C/C++ code
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);[color=#FF0000]// delete[] szBuf;[/color] 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.
[解决办法]
// delete[] szBuf;
szBuf=new char[iLen+1];
这两句是否应该颠倒,使用就正确了
[解决办法]
szBuf是一个传值参数,函数内改变它,函数外还是老的值。这一点,可以看下《c++高质量编程》。
一般来说分配内存,应该谁分配谁释放,看你这个函数,似乎是想第一次在函数外分配内存,函数内释放并重新分配,最后在函数外释放,真是太混乱了。