C++ 运行时检查失败#2-围绕变量';长度';腐败
大家好 我正在修改我们的应用程序以支持unicode 特点。因此,在进行更改时,我必须转换所有 char到wchar\t,我们有一些包装器流类,我 已转换为支持wchar\t。现在我的问题是在做改变的时候 对于下面的代码,我遇到了运行时检查失败#2-四处堆叠 变量“length”已损坏。虽然如果我继续,我会得到 正确的值。请让我知道如何消除这个错误C++ 运行时检查失败#2-围绕变量';长度';腐败,c++,unicode,windows-runtime,runtime,C++,Unicode,Windows Runtime,Runtime,大家好 我正在修改我们的应用程序以支持unicode 特点。因此,在进行更改时,我必须转换所有 char到wchar\t,我们有一些包装器流类,我 已转换为支持wchar\t。现在我的问题是在做改变的时候 对于下面的代码,我遇到了运行时检查失败#2-四处堆叠 变量“length”已损坏。虽然如果我继续,我会得到 正确的值。请让我知道如何消除这个错误 假设生产者写入流的length值是通过data.length()获得的,则它表示字符串中的字符数,而不是字节数。我从它的名字推断,ReadBytes
假设生产者写入流的
length
值是通过data.length()
获得的,则它表示字符串中的字符数,而不是字节数。我从它的名字推断,ReadBytes
正在尝试length
字节,这就是问题所在。您需要读取长度
字符
此外,如果您试图将
length
字节而不是length
字符写入流,则可能会在producer中出现镜像错误。让调试器告诉您。在&length+1
处设置一个数据断点,在&length-1
+1或-1处设置另一个断点会将错误的值复制到数据中。。。实际上,这完全复制了正确的值。。。“没有核心嵌入”,这也通过了测试,但唯一的问题是我得到运行时检查失败…谷歌“什么是数据断点?”我修复了运行时错误。我回滚流代码以写出字节计数和单个字节。宽字符串流现在读取字节计数,并使用字节计数调整其字符计数。流需要有一种一致的数据表示方式,而字符计数不适用于宽字符串,因为字符计数不是字节计数。。。。非常感谢您的回答和支持OID FDMemObject::ReadBytes(void*data,int size)const{int actualSizeToRead=std::min(mLength-composition,size);if(actualSizeToRead>0){wchar_t*dataToCopy(const_cast(reinterpret__cast(data));std::wmemcpy(dataToCopy,mBuffer+mPosition,actualSizeToRead)mPosition+=actualSizeToRead;}FDIStream&FDIStream::operator>>(long&data){if(CanReadData()){ReadBytes(&data,sizeof(data));#if定义(LITTLE_ENDIAN)data=FDCoreUtils::ConvertToFromBigEndianFormat(static_cast(data));#endif}返回*this;}我只传递字节值…它是4…当我将数据复制到缓冲区时…缓冲区有“无嵌入代码”,它应该是字符串,长度为13…在复制后,当我检查数据值时…我看到它的大小为15,并且它有“无嵌入核心”写进它…请让我知道代码的实际错误…我对隐藏复制代码data=FDCoreUtils::ConvertToFromBigEndianFormat(static_cast(data));函数有一些字节操作它…内联字符FDLoByte(short value){return static_cast(value&0x000000FF);}内联int FDHiWord(int-value){return(value>>16)&0x0000FFFF;}内联int-FDLoWord(int-value){return-value&0x0000FFFF;}
FDIStream&
FDIStream::
operator>>(std::wstring& data)
{
if (CanReadData())
{
int length = -1;
*this >> length;
if (length >= 0)
{
// See if length is a valid value (not pass eof)
if (length > GetLength()) {
throw FDException("Corrupted file");
}
wchar_t* buffer = new wchar_t[length];
try
{
ReadBytes(buffer, length);
data = std::wstring(buffer,length);
} catch (...)
{
delete[] buffer;
throw;
}
delete[] buffer;
}
}
return *this;
}