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

use*_*112 2 c++ shared-ptr c++11

我有一节课:

class C{
public:
//Omitted

private:
    shared_ptr<X> anArray[2];
};
Run Code Online (Sandbox Code Playgroud)

X看起来像:

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

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

我认为数组声明C会创建shared_ptr<X>s AND X对象吗?

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

aru*_*nte 5

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

要获得所需内容,只需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];
};
Run Code Online (Sandbox Code Playgroud)

或者,您可以std::make_shared<X>()在初始化列表中使用,而不是std::shared_ptr<X>(new X())因为它导致内存泄漏的异常更高效,更安全.我留下了"原始"形式,因此更清楚地了解发生了什么.