【发布时间】:2013-04-15 13:28:54
【问题描述】:
所以我是 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(另外简要解释一下为什么会导致堆损坏会有很大帮助)。
【问题讨论】:
-
那是生产代码吗?
-
使用
std::string句号!摆脱所有指针的混乱。 -
在 whilte 循环中,是 *psz2 == '0' 吗?或者你的意思是 *psz2 == '\0'
-
psz1从未使用过,psz2将自己分配给psz1。您是否检查过GetLength()返回的大小是否有效?strlen呢?没有办法正常工作。你已经知道尺寸了,为什么不使用pstr->GetLength() + 1作为你的长度呢? -
是的,它是生产代码,这个应用程序早于 std::string 我相信要全部替换它会做很多工作,它正在删除 0 而不是寻找空终止符,是的 GetLength 是返回正确的值。
标签: c++ c++11 mfc cstring heap-corruption