【C++异常解决】libzip库zip_close函数执行报错:读取位置XXX时发生访问冲突。

一.问题描述

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参数,需要手动管理指针的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值