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

问题描述 投票:1回答:1

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

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_compressDecompress

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中。我知道这不是必需的,但是了解这种情况下的错误将有助于我将来避免这种情况。

c++ c++11 pointers
1个回答
0
投票

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

在我的解压缩功能中:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.