微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Z标准解压后堆损坏

如何解决Z标准解压后堆损坏

在大多数情况下,它运行良好。例如,我压缩 3D 网格。几乎所有模型压缩\解压都很好。但是当程序尝试解压缩时,2 或 3 个模型可能会出错。解压好,但释放内存时出错

    // how I read my files
    u8* compressed_v = nullptr;
    u8* compressed_i = nullptr;
    if(!meshhead.m_dataComressSize_i)
    {
        YY_PRINT_Failed;
        return nullptr;
    }
    if(!meshhead.m_dataComressSize_v)
    {
        YY_PRINT_Failed;
        return nullptr;
    }
    
    compressed_v = (u8*)yyMemAlloc(meshhead.m_dataComressSize_v);
    compressed_i = (u8*)yyMemAlloc(meshhead.m_dataComressSize_i);
                            
    in.read((char*)compressed_v,meshhead.m_dataComressSize_v);
    in.read((char*)compressed_i,meshhead.m_dataComressSize_i);
    u32 outsize = 0;
    new_mesh.m_data->m_vertices = yyDecompressData(compressed_v,meshhead.m_dataComressSize_v,outsize,yyCompresstype::ZStd);
    new_mesh.m_data->m_indices = (u8*)yyDecompressData(compressed_i,meshhead.m_dataComressSize_i,yyCompresstype::ZStd);
    
    ...
    yyMemFree(compressed_v);
    yyMemFree(compressed_i); // ERROR HERE

yyMemAllocyyMemFree 只是来自 malloc

freemylib.dll

现在是 ZStd 代码。请检查。

    u8* Engine::compressData_zstd( u8* in_data,u32 in_data_size,u32& out_data_size)
    {
        u8* out_data = (u8*)yyMemAlloc(in_data_size); // malloc
        if( !out_data )
        {
            YY_PRINT_Failed;
            return nullptr;
        }
    
        auto compressBound = ZSTD_compressBound(in_data_size);
    
        size_t const cSize = ZSTD_compressCCtx( m_cctx,out_data,compressBound,in_data,in_data_size,1);
        if( ZSTD_isError(cSize) )
        {
            yyMemFree(out_data); // free
            return nullptr;
        }
    
        //yyMemRealloc(out_data,(u32)cSize); // this give errors so I removed it
        out_data_size = (u32)cSize;
        return out_data;
    }
    
    u8* Engine::decompressData_zstd( u8* in_data,u32& out_data_size)
    {
        unsigned long long const rSize = ZSTD_getFrameContentSize(in_data,in_data_size);
        u8* out_data = (u8*)yyMemAlloc((u32)rSize);
        if( !out_data )
        {
            YY_PRINT_Failed;
            return nullptr;
        }
    
        size_t const dSize = ZSTD_decompress(out_data,(size_t)rSize,in_data_size);
        out_data_size = (u32)dSize;
        return out_data;
    }

或者 ZStd 代码很好,但其他地方有问题?

它看起来像 yyMemAllocyyMemFree 中的问题,但它只是 mallocfree,我在不同的模块(.exe 和许多 .dll)中随处使用它,并且一切正常。

解决方法

如果 in_data 不可压缩,则需要表示的内容超过 in_data_size

顺便说一下,实际最坏情况的计算值是 compressBound

因此为 compressBound 分配 out_data 字节,而不是 in_data_size

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?