C++ 运行时检查失败#2-围绕变量';长度';腐败

C++ 运行时检查失败#2-围绕变量';长度';腐败,c++,unicode,windows-runtime,runtime,C++,Unicode,Windows Runtime,Runtime,大家好 我正在修改我们的应用程序以支持unicode 特点。因此,在进行更改时,我必须转换所有 char到wchar\t,我们有一些包装器流类,我 已转换为支持wchar\t。现在我的问题是在做改变的时候 对于下面的代码,我遇到了运行时检查失败#2-四处堆叠 变量“length”已损坏。虽然如果我继续,我会得到 正确的值。请让我知道如何消除这个错误 假设生产者写入流的length值是通过data.length()获得的,则它表示字符串中的字符数,而不是字节数。我从它的名字推断,ReadBytes

大家好

我正在修改我们的应用程序以支持unicode 特点。因此,在进行更改时,我必须转换所有 char到wchar\t,我们有一些包装器流类,我 已转换为支持wchar\t。现在我的问题是在做改变的时候 对于下面的代码,我遇到了运行时检查失败#2-四处堆叠 变量“length”已损坏。虽然如果我继续,我会得到 正确的值。请让我知道如何消除这个错误


假设生产者写入流的
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;
}