VS2010项目LPSTR转CString问题:获取TEMP路径后发布模式崩溃
问题分析与解决思路
你的代码核心错误是内存分配方式完全错误:new CHAR(MAX_PATH)只分配了1个CHAR大小的内存,还把这个字符的值设为MAX_PATH,根本不是能存储路径的数组。调试模式下堆内存有额外的填充和检查机制,刚好没触发崩溃,但发布模式下内存越界直接导致程序崩溃。
下面给你几种正确的实现方式:
方式1:用栈数组(最推荐,简单安全)
直接在栈上分配足够大小的缓冲区,无需手动管理内存:
CHAR szTempPath[MAX_PATH] = {0}; // GetTempPath的第二个参数是缓冲区总大小,不用减1,函数会自动预留空字符位置 GetTempPathA(MAX_PATH, szTempPath); this->m_FolderPath = szTempPath;
方式2:直接利用CString的缓冲区
CString提供了GetBuffer方法可以直接获取可写入的缓冲区,省去额外数组的创建:
CString strTempPath; // 先获取足够大小的缓冲区 GetTempPathA(MAX_PATH, strTempPath.GetBuffer(MAX_PATH)); // 释放缓冲区,让CString重新管理内部数据 strTempPath.ReleaseBuffer(); this->m_FolderPath = strTempPath;
如果你的项目是Unicode编码(VS2010默认项目一般为Unicode),可以用更通用的TCHAR版本,避免A/W后缀的区分:
CString strTempPath; GetTempPath(MAX_PATH, strTempPath.GetBuffer(MAX_PATH)); strTempPath.ReleaseBuffer(); this->m_FolderPath = strTempPath;
方式3:堆分配(不推荐,除非必要)
如果一定要用堆内存,记得用数组形式分配,并且最好用智能指针避免内存泄漏:
// 分配MAX_PATH个CHAR的数组,()会将内存初始化为0 std::unique_ptr<CHAR[]> path(new CHAR[MAX_PATH]()); GetTempPathA(MAX_PATH, path.get()); this->m_FolderPath = path.get();
内容的提问来源于stack exchange,提问作者Limon
相关产品推荐
相关产品推荐

