关于ATL::CString格式化字符串崩溃

ATL::CString是ATL库中的一个字符串类,提供方便的字符串操作功能,如拼接、比较和子串提取。然而,不正确的使用,如在格式化字符串时混合宽字节和ANSI编码,可能导致内存越界和偶然性崩溃。确保正确处理字符串编码和长度计算以避免这类问题。
摘要由CSDN通过智能技术生成

什么是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虽美好,但也需谨慎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值