shared_ptr<X> 的原始数组,其中 X 似乎没有被初始化?

Raw array of shared_ptr<X> where X doesn't seem to be initialised?

我有一个 class:

class C{
public:
//Omitted

private:
    shared_ptr<X> anArray[2];
};

X 看起来像:

class X{
public:
    X(); //default constructor used by the above array declaration?
private:
    std::unordered_map<int, double> a;
};

在我创建 C class 之后,我访问了数组中的两个 shared_ptr 对象之一,但是,内存似乎没有被初始化。我的意思是 X::a 没有任何有效状态。

我认为 C 中的数组声明会创建 shared_ptr<X>X 对象?

我应该在 X 默认构造函数中明确地做些什么吗?

std::shared_ptr<X> 的默认构造函数绝对 不会 创建 X 的新实例。它这样做是为了允许创建 'empty pointer',相当于 NULL 的智能指针,因此默认构造的智能指针类似于 'default constructed' 原始指针。

要得到你想要的,你只需要在构造函数的初始化列表中初始化 anArray 实例,如下所示:

class C: {

public:
    C() : anArray({std::shared_ptr<X>(new X()), std::shared_ptr<X>(new X())}) // ...
    {
       // rest of constructor
    }

private:
    std::shared_ptr<X> anArray[2];
};

或者,您可以在初始化列表中使用 std::make_shared<X>() 而不是 std::shared_ptr<X>(new X()),因为它在导致内存泄漏的异常方面效率更高,也稍微安全一些。我留下了 'raw' 表格,以便更明确地说明发生了什么。