std::basic_string<T> 不限於字元,可作為任意型別 T 的動態陣列 (如 basic_string<double>)。優勢在於 Copy-on-Write (COW):賦值僅增引用計數 (AddRef),極快;std::vector 則需完整記憶體拷貝。此特性對矩陣運算 (Matrix = a; Matrix += b;) 效能提升顯著。
VC6 STL basic_string::_Split() 實作:
void _Split() {
if (_Ptr != 0 && _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN) {
_E* _Temp = _Ptr;
_Tidy(true);
assign(_Temp); // 錯誤:視為以 '\0' 結尾的字串
}
}
當 T != char (如 double) 且陣列元素含 0 時,assign(_Temp) 會在第一個 0 處截斷,導致資料遺失。
修改 xstring 標頭檔中 _Split 實作:
void _Split() {
if (_Ptr != 0 && _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN) {
_E* _Temp = _Ptr;
size_type _N = _Len; // 保存原始長度
_Tidy(true);
assign(_Temp, _N); // 指定長度,避免 '\0' 截斷
}
}
msvcprt.dll 內未修復代碼,**無效**。/MD 下 string/wstring 仍受 DLL 版本影響。string/wstring 中存放 '\0' 字元。0 元素的非字元陣列,請改用 std::vector 或 winx::CString (非 MFC CString)。VC6 STL COW 實作假設字串語意,導致泛型陣列用法失效。升級至 VS2005+ (放棄 COW、採用 SSO) 為根本解決;維護舊專案請謹慎評估連結模式與資料特性。