如何用shared_ptr替代指向数组内部元素的原始指针代码?
原始代码用原始指针管理float数组,并通过另一个指针引用数组的某个元素,用shared_ptr改写可以分两种场景处理:
1. 仅获取子元素指针(不管理内存)
如果只是需要指向数组元素的指针,不需要让这个子指针参与内存管理,直接通过shared_ptr的get()方法获取原始数组指针后偏移,或者直接取数组元素的地址(C++17及以后支持数组版shared_ptr):
// C++11/14的写法,需要指定数组删除器 std::shared_ptr<float> data(new float[9], std::default_delete<float[]>()); float* d = data.get() + 3; // 等价于原始代码的&data[3] // C++17及以后更简洁的数组版shared_ptr std::shared_ptr<float[]> data(new float[9]); float* d = &data[3]; // 直接取数组元素的地址,和原始写法一致
2. 让子指针参与内存管理(共享控制块)
如果需要让子指针也持有数组的所有权,避免数组被提前释放,可以用shared_ptr的构造函数,传入原shared_ptr和子元素指针,这样两个shared_ptr共享同一个控制块,不会触发重复释放:
// C++11/14版本 std::shared_ptr<float> data(new float[9], std::default_delete<float[]>()); std::shared_ptr<float> d(data, data.get() + 3); // 共享内存管理 // C++17及以后数组版 std::shared_ptr<float[]> data(new float[9]); std::shared_ptr<float> d(data, &data[3]); // 同样共享控制块
注意:不要直接将子元素指针单独构造shared_ptr(比如std::shared_ptr<float> d(&data[3]);),这会导致d尝试释放单个float的内存,而原shared_ptr会释放整个数组,造成双重释放的未定义行为。
内容的提问来源于stack exchange,提问作者Masrul Huda Parvez
相关产品推荐
相关产品推荐

