如何使用std::shared_ptr改写对应原生指针实现的C++代码?
原代码双指针逻辑说明
原代码中My_Int** new_obj = &table.front();的作用是获取deque首元素(存储的My_Int*原生指针)的内存地址,也就是拿到指向deque内部存储的指针的二级指针。后续执行*new_obj = new My_Int(3)时,直接修改了deque内部存储的指针的指向,把原本指向存2的My_Int对象的指针,改成指向新的存3的My_Int对象,所以最终输出3。
智能指针对等实现代码
因为要求deque存储std::shared_ptr类型元素,等价实现如下:
#include <iostream> #include <deque> #include <memory> // 示例My_Int定义,和原代码使用的结构对齐 struct My_Int { int data; My_Int(int val) : data(val) {} }; int main() { std::deque<std::shared_ptr<My_Int>> table; auto table_entry = std::make_shared<My_Int>(2); table.push_back(table_entry); // 等价原代码的双指针逻辑:取deque首元素(shared_ptr对象)的地址 std::shared_ptr<My_Int>* new_obj = &table.front(); // 直接修改deque内部存储的shared_ptr指向 *new_obj = std::make_shared<My_Int>(3); std::cout << table.front()->data << std::endl; // 输出3,和原代码效果一致 // 无需手动释放内存,shared_ptr自动管理生命周期 }
额外说明
- 上述代码完全复现了原代码的逻辑:都是通过持有deque内部元素的指针,直接修改元素本身的值(原生指针/智能指针的指向)
- 如果不需要严格复用原代码的二级指针写法,更符合C++编码习惯的简化写法是直接用引用操作首元素,效果完全一致:
std::shared_ptr<My_Int>& new_obj = table.front(); new_obj = std::make_shared<My_Int>(3); - 智能指针版本会自动处理内存:赋值时旧的
My_Int(2)对象如果没有其他shared_ptr持有,会被自动释放,不存在内存泄漏问题。
内容的提问来源于stack exchange,提问作者Mrosky
相关产品推荐
相关产品推荐

