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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:07:17