You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ATL的CPath是否与底层CString一样采用引用计数而非深拷贝?

结论

ATL的CPath的赋值、拷贝构造行为完全和底层CString一致,默认采用引用计数实现,仅当对字符串内容执行修改操作时才会触发深拷贝(写时复制/COW机制)。

源码依据

结合你提供的CPathT模板源码可以直接得出结论:

  • CPath本质是CPathT<CString>的类型别名,内部唯一存储路径内容的成员是CString类型的m_strPath
  • 类中显式定义的拷贝构造函数直接调用了m_strPath的拷贝构造,而CString的拷贝构造本身不会执行深拷贝,仅会增加对应字符串缓冲区的引用计数
  • 类没有自定义实现拷贝赋值运算符,编译器默认生成的拷贝赋值运算符会直接调用CString的赋值运算符,同样走CString的引用计数逻辑
测试方法

你可以用以下简单代码验证该行为:

CPath path1 = _T("C:\\test\\1.txt");
CPath path2 = path1;
// 赋值后两个CPath内部的字符串缓冲区地址相同,说明是共享同一块内存
ASSERT(path1.m_strPath.GetBuffer() == path2.m_strPath.GetBuffer());

// 修改其中一个CPath的内容
path2.Append(_T(".bak"));
// 修改后缓冲区地址不同,说明触发了写时复制的深拷贝逻辑
ASSERT(path1.m_strPath.GetBuffer() != path2.m_strPath.GetBuffer());

内容的提问来源于stack exchange,提问作者user15284017

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:57:03