现象:
WideString ws;
ws = L"";
wchar_t c[] = L"";
ws = c;
类似以上代码,只要有用 wchar_t 指针给 WideString 赋值,程序就出现错误,甚至崩溃!
原因是 WideString 的等于操作符有问题。
类的定义在 "c:\Program Files\Borland\CBuilder6\Source\vcl\wstring.h" 这个文件里面
其中等于操作符的定义:
WideString& __fastcall operator = (BSTR rhs);
实现在这个文件里面:
"c:\Program Files\Borland\CBuilder6\Source\vcl\wstring.cpp"
WideString& __fastcall WideString::operator=(BSTR src)
{
Empty();
Data = src;
return *this;
}
Empty() 函数是这样写的:
void __fastcall WideString::Empty()
{
if (Data)
{
::SysFreeString(Data);
Data = 0;
}
}
类的私有成员 Data 是这样定义的:
wchar_t *Data;
当用 whcar_t 指针给 WideString 类赋值的时候,WideString 直接保留 wchar_t 指针,而不是分配一块内存再复制内容,这样在释放内存的时候,还是直接释放 Data 指针,也就是赋值之前的那个 wchar_t 指针被释放了,释放了别人的内存,而不是类自己分配的内存,这样就引起了系统崩溃。
由于 WideString 类用的 SysFreeString 这个 API 函数释放内存,而不是用的 new 和 delete,BCB 的 CodeGuard 也无法检测内存泄漏。
不知道有没有遇到这个情况的,最近在写多语言程序,总是在 WideString 上出错,看了 VCL 源码才发现这个 bug, 郁闷。