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

如何在不拷贝数据的情况下将shared_ptr中的数据赋值给原始指针

问题分析与结论

在给定的约束条件下,无法实现不拷贝数据的方案,具体原因如下:

核心限制导致必须拷贝

  1. 生命周期不匹配:调用者传入的buffer由调用者自行管理生命周期,而ReadImpl返回的Buffer对象(及其内部的data指针)的生命周期由std::shared_ptr控制——当Read方法执行完毕,shared_ptr销毁时,外部API会回收其自有buffer的内存。如果直接让buffer指向data的地址,后续调用者访问buffer会触发未定义行为(野指针访问)。
  2. 方法签名不可修改:Read的签名固定为接收调用者提供的uint8_t*,无法通过返回智能指针、输出参数传递所有权等方式,将外部API的buffer所有权转移给调用者。
  3. 外部API无所有权转移接口:现有Buffer类没有提供释放内存所有权的方法(比如类似std::unique_ptr::release()的接口),无法将data的控制权转移给调用者,自然无法让调用者的buffer直接复用这块内存。

特殊场景说明

如果外部API的Buffer::data指向的是全局/持久化内存(不会被API回收),那可以直接执行buffer = data->data;来跳过拷贝,但这种情况不符合"始终返回其自有buffer"的描述,属于极特殊场景,不具备通用性。

综上,你当前基于memcpy的实现是符合约束的最优解。

内容的提问来源于stack exchange,提问作者Raj Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:12:06