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
相关产品推荐
相关产品推荐

