C++ std::shared_ptr:如何为嵌套结构体创建并填充数组成员
问题分析与解决
编译错误原因
直接给std::shared_ptr<buffer[]>赋值裸数组指针new buffer[10]会报错,是因为shared_ptr的数组特化版本(shared_ptr<T[]>)无法通过隐式转换接收裸数组指针,必须显式调用构造函数来创建智能指针实例。
正确填充element成员的方法
有两种常用方式可以正确初始化这个数组类型的shared_ptr:
方式1:显式调用shared_ptr构造函数
直接通过构造函数把裸数组指针包装成shared_ptr<buffer[]>,这种方式兼容所有支持shared_ptr<T[]>的C标准(C11及以上):
stVerify.element = std::shared_ptr<buffer[]>(new buffer[10]);
也可以在定义时直接初始化后再赋值:
std::shared_ptr<buffer[]> elem(new buffer[10]); stVerify.element = elem;
这种方式下shared_ptr会自动用delete[]释放数组内存,符合数组的内存管理规则。
方式2:使用std::make_shared(仅限C++20及以上)
C++20标准开始支持用std::make_shared创建数组类型的shared_ptr,写法更简洁,还能避免额外的内存分配开销:
stVerify.element = std::make_shared<buffer[]>(10);
这里的10指定数组元素个数,buffer作为POD类型会被默认初始化(buffFilled值为0)。
关于make_shared的兼容性说明
如果项目基于C11/C14/C++17标准,不能用std::make_shared创建数组类型的shared_ptr——这些旧标准里的make_shared仅支持非数组类型的对象构造,这种情况下只能用第一种显式构造的方式。
完整修正后的代码示例
以下是兼容C++11及以上的可运行代码:
#include <iostream> #include <memory> using namespace std; struct buffer{ int buffFilled; }; struct verifyStruct{ int capacity; int size; std::shared_ptr<buffer[]> element; }; int main() { verifyStruct stVerify; stVerify.capacity = 10; stVerify.size = 10; // 显式构造初始化element stVerify.element = std::shared_ptr<buffer[]>(new buffer[10]); // 可选:测试数组元素赋值 for(int i = 0; i < stVerify.size; ++i){ stVerify.element[i].buffFilled = i; cout << "buffer[" << i << "].buffFilled = " << stVerify.element[i].buffFilled << endl; } return 0; }
内容的提问来源于stack exchange,提问作者preethi selvaraju
相关产品推荐
相关产品推荐

