什么是ATL::CString
ATL CString是一个类模板,属于Active Template Library(ATL)库的一部分。ATL是一种轻量级的C++库,用于开发Windows应用程序和组件。CString类是ATL库中提供的字符串类之一,用于处理字符串操作。
ATL::CString能做什么
ATL CString类提供了许多字符串处理的功能和方法,使得在C++中进行字符串操作更加方便和高效。它可以用于创建、操作和管理字符串数据,包括拷贝、连接、比较、查找、替换等。
ATL::CString示例
#include <atlstr.h>
#include <iostream>
int main() {
// 字符串拼接
ATL::CString str1 = L"Hello";
ATL::CString str2 = L"World";
ATL::CString result = str1 + str2;
std::wcout << result << std::endl;
// 比较字符串
int compare_result = str1.Compare(str2); // 区分大小写
compare_result = str1.CompareNoCase(str2); // 不区分大小写
// 提取子串
ATL::CString sub_str = result.Mid(5, 5);
sub_str = result.Left(5);
sub_str = result.Right(5);
// 格式化字符串
ATL::CString fmt;
fmt.Format(L"%s %s", str1.GetString(), str2.GetString());
return 0;
}
为什么会崩溃
下方代码能正常编译,但细心的coder能够看出,fmt的格式化是宽字节,但是我们是传递ANSI编码的字符串,这就导致ATL::Cstring计算l和r的长度可能会越界,为什么是可能呢,因为其计算长度偏移为2,如果l和r中的字符长度是基数,那么fmt就会越界访问l和r的内存,从而导致偶然性崩溃
// 格式化字符串
std::string l{"Hello"};
std::string r{"World"};
ATL::CString fmt;
fmt.Format(L"%s %s", l.c_str(), r.c_str());
那为什么是偶然性崩溃呢,我猜想是现在的内存足够大,l和r后面的内存为'\0',计算长度不会越界到不可访问的内存区域上去,一旦访问到特殊内存区域才会导致崩溃
总结
ATL::CString虽美好,但也需谨慎