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

标签 c++ c++11 pointers

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

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/

相关文章:

c++ - 使用 boost::regex 匹配两个完整的单词

C++11 子对象对齐

c++ - 复制省略并在返回值中移动语义

c++ - C++ 中的继承构造函数

c++ - 删除指针时出错

c++ - Microsoft 是否为其 CRT 版本提供 .obj 文件以在 CRT 代码路径上启用整个程序优化?

c++ - 模板类型推导: comparisons between different template types

c - 如何从C中的数组中获取值?

C++如何使用指向 vector 指针的指针

c - 使用 malloc 作为双指针