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

C++:如何初始化std::shared_ptr数组?附相关类定义代码

如何初始化std::shared_ptr数组?

嘿,我来帮你解决这个问题!针对你定义的Base抽象类和Derived派生类,有几种实用的方式来初始化std::shared_ptr<Base>数组,下面给你详细说明:

方法1:使用原始数组直接初始化

你可以先声明一个std::shared_ptr<Base>类型的原始数组,然后逐个为数组元素赋值Derived对象的智能指针。这种方式简单直接,适合固定大小的场景:

#include <iostream>
#include <string>
#include <memory>

// 你的Base和Derived类定义
class Base {
public:
    virtual void printClass()const = 0;
    virtual ~Base(){}
};
class Derived: public Base {
private:
    int m_var1;
    std::string m_var2;
public:
    Derived() = default;
    Derived(const int& v1, const std::string& v2) :m_var1(v1), m_var2(v2) { }
    void printClass()const override {
        std::cout << "Derived Class with var1: " << m_var1 << ", var2: " << m_var2 << "\n";
    }
};

int main() {
    // 声明一个包含3个元素的shared_ptr<Base>数组
    std::shared_ptr<Base> arr[3];
    
    // 逐个初始化数组元素,利用多态特性自动转换
    arr[0] = std::make_shared<Derived>(1, "Hello");
    arr[1] = std::make_shared<Derived>(2, "World");
    arr[2] = std::make_shared<Derived>(3, "StackOverflow");
    
    // 测试调用虚函数
    for (const auto& ptr : arr) {
        ptr->printClass();
    }
    
    return 0;
}

方法2:使用std::vector(更推荐)

在C++中,用std::vector<std::shared_ptr<Base>>代替原始数组是更灵活、安全的选择——它支持动态调整大小,还能自动管理内存,避免手动处理数组越界等问题:

int main() {
    // 直接用初始化列表创建vector并填充元素
    std::vector<std::shared_ptr<Base>> vec = {
        std::make_shared<Derived>(1, "Apple"),
        std::make_shared<Derived>(2, "Banana"),
        std::make_shared<Derived>(3, "Cherry")
    };
    
    // 还可以用emplace_back动态添加新元素
    vec.emplace_back(std::make_shared<Derived>(4, "Date"));
    
    // 遍历调用
    for (const auto& ptr : vec) {
        ptr->printClass();
    }
    
    return 0;
}

方法3:使用std::array(固定大小容器)

如果你的数组大小是编译期确定的固定值,std::array<std::shared_ptr<Base>, N>是个好选择——它兼顾了原始数组的性能和标准容器的安全性:

#include <array>

int main() {
    // 创建固定大小为3的array并初始化
    std::array<std::shared_ptr<Base>, 3> arr = {
        std::make_shared<Derived>(1, "Red"),
        std::make_shared<Derived>(2, "Green"),
        std::make_shared<Derived>(3, "Blue")
    };
    
    // 遍历测试
    for (const auto& ptr : arr) {
        ptr->printClass();
    }
    
    return 0;
}

几个关键注意点

  • 你已经正确地将Base类的析构函数声明为虚函数,这非常重要!只有这样,std::shared_ptr在销毁对象时才能正确调用Derived类的析构函数,避免内存泄漏。
  • 尽量使用std::make_shared来创建智能指针,而不是手动new对象再传入std::shared_ptr构造函数——前者会一次性分配对象和智能指针控制块的内存,效率更高,也更安全。

内容的提问来源于stack exchange,提问作者JeJo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:03:00