gpt4 book ai didi

c++ - 删除 [] 时出现堆损坏错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:26 27 4
gpt4 key购买 nike

所以我是 C++ 的新手,所以我确定这是一个相对简单的问题,但我有一个遗留的 C++ 应用程序,我正在尝试追踪堆损坏问题并将其追踪到此函数:

void LTrimZeros(CString *pstr)
{
char *psz1;
char *psz2;

if ( pstr->GetLength() == 0 )
return;


psz1 = new char[pstr->GetLength() + 1];
psz2 = psz1;

strcpy_s( psz2, strlen(psz2), (const char *) *pstr );

while ( *psz2 == '0' )
{
psz2++;
}

*pstr = psz2;

delete [] psz1;

return;
}

当它尝试删除 psz1 时,它会抛出堆损坏错误。同样,我是 C++ 的新手,所以我不想尝试修复此问题并意外引入内存泄漏,所以我想我会请教专家。相同功能的替代解决方案也很好,因为这个应用程序最初是用 c++4 编写的,但现在升级到 c++11(同时简要解释为什么这会导致堆损坏将有很大帮助)。

最佳答案

strlen(psz2) 正在读取未初始化的内存,因此读取的内容可能超出数组的末尾。这意味着您传递给 strcpy_s 的长度将不可预测,并且可能导致您写入超出为 psz1 分配的内存的末尾。

假设您的函数结尾是有效的(我对 CString 还不够熟悉,无法确定),您只需将 strcpy_s 行更改为

strcpy_s( psz2, pstr->GetLength() + 1, (const char *) *pstr );

您可能会遇到 win32 字符串处理函数的问题,这些函数根据 UNICODE_UNICODE 定义在 8 位和 16 位字符之间切换。我同意 Alok Save 和其他人的观点,即切换到使用 std::string 会更清晰、更简单。

关于c++ - 删除 [] 时出现堆损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16150613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com