You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中将原始指针替换为shared_ptr存储图像缓冲区出现段错误如何解决

问题核心原因

你的段错误由两个错误共同触发:

  • 智能指针类型声明错误:你定义的std::shared_ptr<void*>是指向void类型指针的智能指针,而非指向字节缓冲区的智能指针。此时_originalData.get()返回的是二级指针void**,但file.Read要求传入缓冲区的一级指针void*,类型不匹配导致非法内存访问触发段错误。同时你用std::make_shared给void*分配内存,并没有让智能指针管理malloc申请的缓冲区内存,还会导致缓冲区内存泄漏。
  • 内存释放逻辑不匹配:std::shared_ptr默认使用delete释放管理的内存,和malloc对应的free释放逻辑不兼容,即使类型修正后如果不指定删除器,后续也会出现内存释放异常。
修复方案

直接调整智能指针的声明和构造逻辑即可,不需要改动其他调用指针的代码:

_dataSize = (size_t)len;
// 修正为shared_ptr<void>管理缓冲区,指定free作为删除器
_originalData = std::shared_ptr<void>(malloc(_dataSize), free);
if ( file.Read(_originalData.get(), _dataSize) != len )

如果要更方便后续操作字节数据,也可以将智能指针类型明确为字节类型,避免后续强转:

// 类成员声明修改为std::shared_ptr<uint8_t> _originalData;
_originalData = std::shared_ptr<uint8_t>((uint8_t*)malloc(_dataSize), free);
可选优化方案

如果没有必须使用malloc的兼容需求,更推荐用std::vector<uint8_t>存储字节缓冲区,不需要手动管理内存生命周期,调用接口时直接传vector.data()即可,比智能指针管理裸缓冲区的安全性更高。

内容的提问来源于stack exchange,提问作者João Lucas Gouveia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:12:01