一.问题描述
1.1在使用libzip库时,执行到结尾关闭压缩包的zip_close函数时报异常。
1.2问题代码示例
//示例代码,部分代码细节省略
......
//打开压缩包文件
zip_t* z = zip_open(path, ZIP_CREATE | ZIP_EXCL, &error);
if(hasbmp) {
//bmpdata存储bmp图片数据
std::vector<uchar> bmpdata = buildBmpData();
//创建内存缓冲区读取数据
bmpSrc = zip_source_buffer(z, bmpdata.data(), bmpdata.size(), 0);
//把bmp图片数据添加到压缩包中
zip_file_add(z, "imgdata.bmp", bmpSrc, ZIP_FL_ENC_UTF_8 | ZIP_FL_OVERWRITE);
}
//关闭文件
zip_close(z);
1.3出错状态
二.问题分析
2.1造成错误的原因在这段代码
bmpSrc = zip_source_buffer(z, bmpdata.data(), bmpdata.size(), 0);
2.2核心问题:
必须保证zip_source_buffer中传入的对象直到zip_close关闭之后才被销毁。
而我们示例中传入给zip_source_buffer的bmpdata数据在超出作用域之后就被销毁掉了。
2.3zip_close函数执行原理
三.解决方案
//示例代码,部分代码细节省略
......
if(hasbmp) {
std::vector<uchar> bmpdata = buildBmpData();
void* buffer_copy = malloc(bmpdata.size());
memcpy(buffer_copy, bmpdata.data(), bmpdata.size());
bmpSrc = zip_source_buffer(z, buffer_copy, bmpdata.size(), 1);
}
3.1通过创建一块新的内存,用memcpy拷贝相同的数据给zip处理即可。
3.2设置zip_source_buffer最后一个参数为1,把当前内存交给zip处理,如果使用0参数,需要手动管理指针的内存。