我如何使用 unique_ptr 和 make_unique 正确声明对象数组
How may I properly declare an object array using unique_ptr along with make_unique
我正在尝试声明并初始化一个 unique_ptr
持有一个 class 数组
这是我用来解决项目内存管理问题的示例。我可以声明指针,但无法对其进行初始化。
class CrewMember
{
};
class SpaceShip
{
// generates error
std::unique_ptr<CrewMember[3][3]> ship_crew_members = std::make_unique< new CrewMember[3][3]>;
// compiles fine
std::unique_ptr<CrewMember[3][3]> ship_crew_members;
};
收到的错误:
call to non-constexpr function 'void* operator new '
std::unique_ptr ship_crew_members = std::make_unique< new CrewMember[3][3]>;
^
cannot resolve overloaded function 'make_unique' based on conversion to type 'std::unique_ptr'
std::unique_ptr ship_crew_members = std::make_unique< new CrewMember[3][3]>;
std::unique_ptr
存储指向单个对象或 one-dimensional 数组的指针。 Multi-dimensional 不支持数组。理论上它可以存储一个指向多维数组的指针,如果你做了一个邪恶的转换,但你真的不应该。
如果你真的想用std::unique_ptr
存储多维数组,你需要做一些额外的工作并使用one-dimensional数组然后计算偏移量自己为多维索引(例如 [1][2]
变为 1*3+2
)。
std::make_unique
是函数模板。模板参数需要是正确的类型,可以是 class 或 class 数组(但没有大小)。如果您的类型是一个数组并且您给 std::make_unique
一个大小作为参数,它将创建一个指向该大小的数组的 std::shared_ptr
并在该数组上使用正确的 delete[]
运算符它被破坏了。
所有这些看起来像这样:
std::shared_ptr<CrewMember[]> ship_crew_members = std::make_shared<CrewMember[]>(9);
但是我强烈建议不要这样做。更简单的是使用任何标准容器,例如std::vector
:
std::vector<std::vector<CrewMember>> ship_crew_members;
这为您提供了一个大小不一的多维容器,您可以向其中添加元素或从中删除元素。
或 std::array
对于固定大小的多维数组:
std::array<std::array<CrewMember, 3>, 3> ship_crew_members;
我正在尝试声明并初始化一个 unique_ptr
持有一个 class 数组
这是我用来解决项目内存管理问题的示例。我可以声明指针,但无法对其进行初始化。
class CrewMember
{
};
class SpaceShip
{
// generates error
std::unique_ptr<CrewMember[3][3]> ship_crew_members = std::make_unique< new CrewMember[3][3]>;
// compiles fine
std::unique_ptr<CrewMember[3][3]> ship_crew_members;
};
收到的错误:
call to non-constexpr function 'void* operator new ' std::unique_ptr ship_crew_members = std::make_unique< new CrewMember[3][3]>;
^
cannot resolve overloaded function 'make_unique' based on conversion to type 'std::unique_ptr' std::unique_ptr ship_crew_members = std::make_unique< new CrewMember[3][3]>;
std::unique_ptr
存储指向单个对象或 one-dimensional 数组的指针。 Multi-dimensional 不支持数组。理论上它可以存储一个指向多维数组的指针,如果你做了一个邪恶的转换,但你真的不应该。如果你真的想用
std::unique_ptr
存储多维数组,你需要做一些额外的工作并使用one-dimensional数组然后计算偏移量自己为多维索引(例如[1][2]
变为1*3+2
)。std::make_unique
是函数模板。模板参数需要是正确的类型,可以是 class 或 class 数组(但没有大小)。如果您的类型是一个数组并且您给std::make_unique
一个大小作为参数,它将创建一个指向该大小的数组的std::shared_ptr
并在该数组上使用正确的delete[]
运算符它被破坏了。
所有这些看起来像这样:
std::shared_ptr<CrewMember[]> ship_crew_members = std::make_shared<CrewMember[]>(9);
但是我强烈建议不要这样做。更简单的是使用任何标准容器,例如std::vector
:
std::vector<std::vector<CrewMember>> ship_crew_members;
这为您提供了一个大小不一的多维容器,您可以向其中添加元素或从中删除元素。
或 std::array
对于固定大小的多维数组:
std::array<std::array<CrewMember, 3>, 3> ship_crew_members;