运行时检查失败 #2 - 变量周围的堆栈'length'已损坏

Run-Time Check Failure #2 - Stack around the variable 'length' was corrupted

本文关键字:堆栈 已损坏 length 周围 失败 检查 变量 运行时      更新时间:2023-10-16

大家好,

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

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;
}

假设生产者写入流的length的值是通过data.length()获得的,那么它表示字符串中字符的数量,而不是字节数量。根据它的名称,我认为ReadBytes正在尝试length字节,这就是问题所在。您需要读取length个字符。

此外,如果您试图向流中写入length字节而不是length字符,那么生产者中可能存在镜像错误。