Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除[]时出现堆损坏错误 P> >我是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; }_C++_C++11_Mfc_Cstring_Heap Corruption - Fatal编程技术网

删除[]时出现堆损坏错误 P> >我是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; }

删除[]时出现堆损坏错误 P> >我是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; },c++,c++11,mfc,cstring,heap-corruption,C++,C++11,Mfc,Cstring,Heap Corruption,当它试图删除psz1时,抛出堆损坏错误。同样,我对C++还很陌生,所以我不想尝试修复这个问题,并且无意中引入了内存泄漏,所以我想我会问专家。相同函数的替代解决方案也不错,因为这个应用程序最初是用c++4编写的,但现在升级到c++11(同时简要解释一下这会导致堆损坏的原因会有很大帮助)。strlen(psz2)正在读取未初始化的内存,因此可能会读取超出数组末尾的内容。这意味着您传递给strcpy_s的长度将是不可预测的,并且可能导致您的写入超出为psz1分配的内存的末尾 假设函数的结尾是有效的(我

当它试图删除
psz1
时,抛出堆损坏错误。同样,我对C++还很陌生,所以我不想尝试修复这个问题,并且无意中引入了内存泄漏,所以我想我会问专家。相同函数的替代解决方案也不错,因为这个应用程序最初是用c++4编写的,但现在升级到c++11(同时简要解释一下这会导致堆损坏的原因会有很大帮助)。

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

假设函数的结尾是有效的(我不太熟悉,不能肯定),只需将
strcpy\s
行更改为

strcpy_s( psz2, pstr->GetLength() + 1, (const char *) *pstr );
根据
UNICODE
\u UNICODE
的定义,win32字符串处理函数在8位和16位字符之间切换时可能会遇到问题。我同意Alok Save和其他人的观点,即切换到使用
std::string将更加清晰和简单。

来自MSDN:

errno_t strcpy_s(
   char *strDestination,
   size_t numberOfElements,
   const char *strSource 
);
这里,在您的代码中,您正在对未初始化的数组调用
strlen
,您需要修复它(传递目标缓冲区可以存储的最大元素数)


那是生产代码吗?使用
std::string
period!摆脱所有指针的混乱。在whilte循环中,它是*psz2=='0'吗?或者您的意思是,*psz2=='\0'
psz1
从未使用,
psz2
将自身分配给
psz1
。您是否已检查
GetLength()
是否返回有效的大小?斯特伦怎么样?这是不可能正常工作的。你已经知道了大小,为什么不使用
pstr->GetLength()+1
作为你的长度呢?是的,这是生产代码,这个应用程序早于std::string,我相信替换它需要很多工作,它正在删除0而不是寻找空终止符,是的,GetLength正在返回正确的值。
*pstr=psz2
CString
支持吗?“不!”特洛伊敌人,上尉忘了我还没完成那项任务。我将相应地改写我的答案。
psz2=psz1
这不是意味着
psz2
指向的是
psz1
,它刚刚
更新了
。我宁愿用C#重写这个应用程序。@KevinDiTraglia Hehe,哦,就是这样:)你刚才不是复制了这个bug,将strlen(psz2)作为长度参数传递给strcpy_s()?是的,我在这里显示了bug的精确行,没有显示bug修复(留给读者作为练习-应该很容易,真的)。
strcpy_s( psz2, strlen(psz2), (const char *) *pstr );