如何在不拷贝数据的情况下将shared_ptr中的数据赋值给原始指针
问题分析与结论
在给定的约束条件下,无法实现不拷贝数据的方案,具体原因如下:
核心限制导致必须拷贝
- 生命周期不匹配:调用者传入的
buffer由调用者自行管理生命周期,而ReadImpl返回的Buffer对象(及其内部的data指针)的生命周期由std::shared_ptr控制——当Read方法执行完毕,shared_ptr销毁时,外部API会回收其自有buffer的内存。如果直接让buffer指向data的地址,后续调用者访问buffer会触发未定义行为(野指针访问)。 - 方法签名不可修改:
Read的签名固定为接收调用者提供的uint8_t*,无法通过返回智能指针、输出参数传递所有权等方式,将外部API的buffer所有权转移给调用者。 - 外部API无所有权转移接口:现有
Buffer类没有提供释放内存所有权的方法(比如类似std::unique_ptr::release()的接口),无法将data的控制权转移给调用者,自然无法让调用者的buffer直接复用这块内存。
特殊场景说明
如果外部API的Buffer::data指向的是全局/持久化内存(不会被API回收),那可以直接执行buffer = data->data;来跳过拷贝,但这种情况不符合"始终返回其自有buffer"的描述,属于极特殊场景,不具备通用性。
综上,你当前基于memcpy的实现是符合约束的最优解。
内容的提问来源于stack exchange,提问作者Raj Kumar
相关产品推荐
相关产品推荐

