如何使用unique_ptr和make_unique正确声明对象数组
How may I properly declare an object array using unique_ptr along with make_unique
>我正在尝试声明和初始化一个保存类数组的unique_ptr
这是我用来解决项目内存管理问题的示例。我可以声明指针,但无法初始化它。
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;
};
收到的错误:
调用非 constexpr 函数 'void* 运算符新 ' std::unique_ptr ship_crew_members = std::make_unique<新船员[3][3]>;
^
无法根据转换为类型"std::unique_ptr"来解决重载函数"make_unique" std::unique_ptr ship_crew_members = std::make_unique<新船员[3][3]>;
-
std::unique_ptr
存储指向单个对象或一维数组的指针。不支持多维数组。理论上,如果你做一个邪恶的投射,它可以存储一个指向多维数组的指针,但你真的不应该。 -
如果你真的想用
std::unique_ptr
来存储一个多维数组,你需要做一些额外的工作,使用一维数组,然后自己计算多维索引的偏移量(例如[1][2]
变成1*3+2
)。 -
std::make_unique
是一个函数模板。模板参数需要是一个正确的类型,它可以是一个类或一个类数组(但没有大小)。如果您的类型是一个数组,并且您为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;
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 为什么 std::unique 不调用 std::sort?
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型