WideString - COM (component object model) 的 BSTR 类型的封装,而不是标准 C/C++ 的字符串类型的封装。
如果你正在用、打算用、或者曾经用过 6.0 或更早期的 C++ Builder 版本,一定要看【注:赋值操作符 operator = 的问题】
成员:
• 属性 • 方法 • 事件 • 类型 • 数据
头文件:
#include <System.hpp>
命名空间:
System
继承关系:
无
注:赋值操作符 operator = 的问题
老版本的 C++ Builder,例如 C++ Builder 6.0 的赋值操作符,就相当于 Attach 方法,直接引用了 BSTR,这样会让把 wchar_t * 型的普通 C/C++ 字符串,或者字符串常数赋值给 WideString,按照 BSTR 类型进行引用,而引起内存管理错误,发送无法捕获的异常,甚至程序崩溃。
新版本的 C++ Builder,例如 C++ Builder 2007 之后的版本的赋值操作符,会把字符串复制到当前的数据里面,不会产生误操作错误,但是会产生和老版本程序的兼容性问题。老版本会接管 BSTR 的内存管理和销毁工作,而新版本只是把数据复制过来,并不接管 BSTR 的任何操作。
程序代码 |
C++ Builder 6.0 及更早期的版本 |
C++ Builder 2007 及更新的版本 |
WideString s;
s = L"你好"; // 使用赋值操作符 |
会出现无法捕获的异常,字符串被 Attach 接管而不是复制,
由于接管的不是 BSTR 类型,内存管理会出问题,程序崩溃 |
没有任何问题,
被复制到字符串内部管理的数据 |
|