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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:50:30