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' 表格,以便更明确地说明发生了什么。
我有一个 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' 表格,以便更明确地说明发生了什么。