gpt4 book ai didi

c++ - 具有大数据长度的解压缩缓冲区崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:59 26 4
gpt4 key购买 nike

这是我用来解压缩缓冲区的函数。

string unzipBuffer(size_t decryptedLength, unsigned char * decryptedData)
{
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.avail_in = decryptedLength;
stream.next_in = (Bytef *)decryptedData;
stream.total_out = 0;
stream.avail_out = 0;
size_t dataLength = decryptedLength* 1.5;
char c[dataLength];

if (inflateInit2(&stream, 47) == Z_OK)
{
int status = Z_OK;
while (status == Z_OK)
{
if (stream.total_out >= dataLength)
{
dataLength += decryptedLength * 0.5;
}

stream.next_out = (Bytef *)c + stream.total_out;

stream.avail_out = (uint)(dataLength - stream.total_out);

status = inflate (&stream, Z_SYNC_FLUSH);

}
if (inflateEnd(&stream) == Z_OK)
{
if (status == Z_STREAM_END)
{
dataLength = stream.total_out;
}
}
}
std::string decryptedContentStr(c, c + dataLength);
return decryptedContentStr;
}

直到今天我才意识到它在这一行因大数据缓冲区(例如:decryptedLength:342792)而崩溃时一直运行良好:

status = inflate (&stream, Z_SYNC_FLUSH);

经过一两次迭代。谁能帮帮我?

最佳答案

如果您的代码通常可以正常工作,但无法处理大型数据集,那么这可能是由于堆栈溢出造成的,正如@StillLearning 在他的评论中指出的那样。

通常(默认)堆栈大小为 1 MB。当你的 decryptedLength是 342,792,那么你尝试在以下行中分配 514,188 字节:

char c[dataLength];

连同代码中的其他分配(最后在 inflate() 函数中),这可能已经太多了。要克服这个问题,您应该动态分配内存:

char* c = new char[dataLength];

如果你这样做,那么请不要忘记在你的unzipBuffer()结束时释放分配的内存。功能:

delete[] c;

如果忘记删除分配的内存,那么就会发生内存泄漏。

如果这不能(完全)解决您的问题,您仍然应该这样做,因为对于更大的数据集,由于堆栈的大小有限,您的代码肯定会中断。​​


如果您需要在 while() 中“重新分配”动态分配的缓冲区循环,那么请看this Q&A .基本上你需要使用 new 的组合, std::copy , 和 delete[] .但是,如果您交换您的 char 会更合适数组 std::vector<char>甚至 std::vector<Bytef> .然后你就可以通过使用 resize() 轻松地扩大你的缓冲区。功能。您可以直接访问 vector 的缓冲区通过使用 &my_vector[0]为了将其分配给 stream.next_out .

关于c++ - 具有大数据长度的解压缩缓冲区崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31991444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com