【问题标题】:Stack overflow creating an archive using libzip堆栈溢出使用 libzip 创建存档
【发布时间】:2013-06-23 11:15:58
【问题描述】:

要开始使用libzip,我尝试创建一个存档并向其中添加一个文件。这是我的代码。

string archive  = "path/to/archive.zip";
string file     = "message";
char *data      = "Hello World!";

int error = 0;
zip *archive = zip_open(path.c_str(), ZIP_CREATE, &error);
if(error)
{
    cout << "could not open or create archive" << endl;
    return false;
}

zip_source *source = zip_source_buffer(archive, data, sizeof(data), 0);
if(source == NULL)
{
    cout << "failed to create source buffer. " << zip_strerror(archive) << endl;
    return false;
}

int index = (int)zip_file_add(archive, file.c_str(), source, ZIP_FL_OVERWRITE);
if(index < 0)
{
    cout << "failed to add file to archive. " << zip_strerror(archive) << endl;
    return false;
}

zip_source_free(source);
zip_close(archive);

return true;

此代码在zip_close() 调用中引发运行时错误。

Application.exe 中 0x00EDDD16 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000001、0x002C2FFC)。

更新:我删除了zip_source_free() 调用,因为我被告知zip_file_add() 已经完成了这项工作。此外,我检查archive 以不持有NULL。这些更改在zip_close() 引发了另一个错误。

Application.exe 中 0x0065BC57 处未处理的异常:将无效参数传递给认为无效参数致命的函数。

我做错了什么?

【问题讨论】:

  • data 的声明甚至无法在 C++11 中编译,因为修改字符串文字毫无意义。
  • @chris data 仅用于测试。我是从documentation 拿来的。它在 Visual Studio 11 中编译时没有警告。
  • zip_open.c_str()之前还有一个额外的右括号。
  • @SamuelTardieu 感谢您指出这一点。

标签: c++ zip stack-overflow


【解决方案1】:

您不应调用zip_source_free(),因为source 已在zip_file_add() 中使用并在那里释放。

另外,您应该检查zip_open()返回值,而不是errorp 的值。文档中没有任何内容表明错误代码不同于 0。但是,如果无法打开 zip 文件,则返回值NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多