gpt4 book ai didi

c++ - 将指针传递给导致第二次调用使程序崩溃的函数

转载 作者:行者123 更新时间:2023-12-02 10:30:55 25 4
gpt4 key购买 nike

我正在测试一个压缩库,它对我来说很好用,但是我需要一个包装函数来避免一些不需要的参数。库调用如下所示:

typedef int WINAPI OodleLZ_CompressFunc(
uint32_t codec, char *src_buf, uint64_t src_len, char *dst_buf, int64_t level,
void *opts, int64_t offs);
typedef int WINAPI OodleLZ_DecompressFunc(
char *src_buf, int64_t src_len, char *dst_buf, uint64_t dst_size, int fuzz, int crc, int verbose,
uint8_t *dst_base, size_t e, void *cb, void *cb_ctx, void *scratch, size_t scratch_size, int threadPhase
);

我分配的功能如下:
OodleLZ_CompressFunc* oodl_compress;
OodleLZ_DecompressFunc* oodl_decompress;

当我调用解压缩函数时,使用 oodl_compressoodl_decompress的压缩函数一切正常。但是,当我为函数创建包装器时,压缩将停止工作。

工作场景:
// Predefined data, compressed_size, decompressed_size
char *dec_data = new char [decompressed_size];
oodl_decompress(data, compressed_size, dec_data, decompressed_size, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

char *com_data = new char [decompressed_size + 0x10000];
oodl_compress(c_type, dec_data, decompressed_size, com_data, c_level, 0, 0); //c_type and c_level are constants (7 in this case)

当我创建包装 Decompress时,调用 Decompress可以工作,但是调用 oodl_compress不再起作用。 Decompress:
int Decompress(char* src_buf, int64_t src_len, char* dst_buf, uint64_t dst_len)
{
oodl_decompress(src_buf, src_len, dst_buf, dst_len, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
main.cpp:
// Predefined data, compressed_size, decompressed_size
char *dec_data = new char [decompressed_size];
Decompress(data, compressed_size, dec_data, decompressed_size);

char *com_data = new char [decompressed_size + 0x10000];
oodl_compress(c_type, dec_data, decompressed_size, com_data, c_level, 0, 0); //c_type and c_level are constants (7 in this case)

发生的情况是,在第二种情况下调用 oodl_compress时,程序将冻结1秒,然后退出,而不会出现任何错误。之后,我得到的代码只是 fout<<到一个文件中,我可以看到在第二种情况下该文件为空,在第一种情况下该文件被重新压缩,代表了数据的原始状态。

我似乎不知道问题出在哪里,因为我只是将变量传递到另一个函数中,该函数仅用0填充其余参数,而不是将其保存在main中。我知道这不是必须的,但是了解这种情况下的错误将有助于我将来避免这种情况。

最佳答案

我找到了问题,但我不知道“为什么”是问题。

在我的解压缩功能中:

void Decompress(char* src_buf, int64_t src_len, char* dst_buf, uint64_t dst_len)
{
int data_size = oodl_decompress(src_buf, src_len, dst_buf, dst_len, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

if (data_size < 0)
{
throw std::string("Decompression Error");
}
}

在我的压缩功能中:
int64_t Compress(char *src_buf, uint64_t src_len, char* dst_buf)
{
int64_t data_len;
data_len = oodl_compress(compression_type, src_buf, src_len, dst_buf, compression_level, 0, 0);
return data_len;
}

两种情况的罪魁祸首都是 data_lendata_size变量。由于某种原因,无论何时删除它们,代码都可以正常工作。我猜这与堆栈/堆有关吗? (我对术语不是很好)。
对此有任何见识,并提出了建议的解决方案/替代方案!
现在,我只是将两个函数互换为:
int64_t Compress(char *src_buf, uint64_t src_len, char* dst_buf)
{
return oodl_compress(compression_type, src_buf, src_len, dst_buf, compression_level, 0, 0);
}

void Decompress(char* src_buf, int64_t src_len, char* dst_buf, uint64_t dst_len)
{
oodl_decompress(src_buf, src_len, dst_buf, dst_len, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}

关于c++ - 将指针传递给导致第二次调用使程序崩溃的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62310434/

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