如何在支持多文件选择的CFileDialog中使用智能指针?
CFileDialog多选场景下智能指针改造方案
原代码的核心痛点是手动申请的字符缓冲区需要在所有退出路径手动释放,容易遗漏造成内存泄漏,使用C++标准库的智能指针可以自动管理内存生命周期,完全避免该问题。
改造步骤
- 第一步:引入智能指针头文件
#include <memory>(工程已引入可跳过) - 第二步:替换原始裸指针定义为
std::unique_ptr数组特化版本,自动申请内存 - 第三步:使用智能指针的
get()方法获取原始缓冲区指针,赋值给CFileDialog的m_ofn.lpstrFile成员 - 第四步:删除所有手动
delete[] pszFile的代码,智能指针会在函数退出时自动释放内存
改造后完整代码
#include <memory> // 新增智能指针头文件 void CExportSettingsDlg::OnBnClickedMfcbuttonImportXsl() { CString strFilter; // 用于过滤展示对应类型的模板文件 CString strTargetFolder = theApp.GetWorkingPath(); // 默认路径 // 替换原始裸指针为智能指针,自动申请32767长度的WCHAR数组 std::unique_ptr<WCHAR[]> pszFile = std::make_unique<WCHAR[]>(32767); TCHAR szTabText[_MAX_PATH] = { 0 }; // 存储选中标签文本的缓冲区,用于过滤描述 // 初始化过滤字符串 strFilter = _T("Styles|SRRSchedule*.xsl;SRRSchedule*.css||"); // 初始化文件对话框 CFileDialog dlgImport(TRUE, _T(".XSL"), _T(""), OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, strFilter, this); ZeroMemory(pszFile.get(), 32767 * sizeof(WCHAR)); dlgImport.m_ofn.lpstrFile = pszFile.get(); // 传入智能指针管理的原始缓冲区地址 dlgImport.m_ofn.nMaxFile = 32767; dlgImport.m_ofn.nFileOffset = 0; if (dlgImport.DoModal() != IDOK) { // 无需手动释放内存,智能指针自动处理 return; } // 遍历选中的文件 POSITION pos = dlgImport.GetStartPosition(); CString strSourceFilePath, strTargetFilePath, strSourceFileName, strSourceFileTitle, strSourceExtension, strFileName; while (pos) { strSourceFilePath = dlgImport.GetNextPathName(pos); // ... } // 无需手动释放内存,智能指针自动处理 }
注意:如果你的工程仍使用多字节字符集,将
WCHAR替换为TCHAR即可,unique_ptr的使用逻辑完全一致。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

