当前位置: 首页 > 知识库问答 >
问题:

如何使用unique_ptr和make_unique正确声明对象数组

孙博艺
2023-03-14

我正在尝试声明和初始化一个保存类数组的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;

};

收到的错误:

对非常量表达式函数“void*operator new”的调用std::unique_ptr ship_crew_members=std::make_unique

共有1个答案

邓开济
2023-03-14

>

  • std::unique_ptr存储指向单个对象或一维数组的指针。不支持多维数组。理论上它可以存储指向多维数组的指针,如果你做了邪恶的转换,但你真的不应该。

    如果你真的想使用 std::unique_ptr 来存储一个多维数组,你需要做一些额外的工作并使用一维数组,然后自己计算多维索引的偏移量(例如 [1][2] 变成 1*3 2)。

    std::make_unique是一个函数模板。模板参数需要是一个正确的类型,它可以是一个类或一个类数组(但没有大小)。如果您的类型是一个数组,并且您给std::make_unique一个大小作为参数,它将创建一个std::shared_ptr,指向该大小的数组,并在该数组被破坏时使用正确的删除[]运算符。

    所有这些看起来都是这样的:

    std::shared_ptr<CrewMember[]> ship_crew_members = std::make_shared<CrewMember[]>(9);
    

    但是,我强烈建议不要这样做。更简单的是使用任何 std 容器,例如 std::vector:

    std::vector<std::vector<CrewMember>> ship_crew_members;
    

    这为您提供了一个不同大小的多维容器,您可以在其中添加或删除元素。

    对于固定大小的多维数组,或std::array

    std::array<std::array<CrewMember, 3>, 3> ship_crew_members;
    

  •  类似资料:
    • 本文向大家介绍如何使用JSP声明来声明类的对象?,包括了如何使用JSP声明来声明类的对象?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明中对象声明的示例-

    • 根据这个答案,粗略地说,如果我们有一个学生对象的课堂对象数组,类[索引]!=学生1。我相信这是我在实现等于方法将数组[索引]对象与另一个对象进行比较时犯的错误。我相信数组[索引]和我正在比较的对象是相同的。 下面的代码显示了我的getNumStudents方法,在该方法中,我尝试计算一个学生id在一个班级中出现的次数。ID代表他或她喜欢的品牌鞋(课后练习)。这个方法在我的教室对象类中,它实现了一个

    • 本文向大家介绍如何使用Java声明OpenCV Mat对象?,包括了如何使用Java声明OpenCV Mat对象?的使用技巧和注意事项,需要的朋友参考一下 在OpenCV中,Mat类表示用于存储图像的矩阵对象。您还可以手动声明Mat对象- 加载OpenCV本机库-使用OpenCV库编写Java代码时,第一步是使用加载OpenCV本机库。 实例化Mat类 -使用本章前面提到的任何函数实例化Mat类。

    • 问题内容: 我想问一个关于Java的问题。我有一个用户定义的对象类,学生,它有2个数据成员,名称和ID。在另一个类中,我必须声明那个object [](例如)。但是,我不知道对象数组的大小。是否可以声明对象数组但不知道大小?谢谢。 问题答案: 用户。添加新元素时,它将自动扩展。以后,您可以根据需要将其转换为数组。 作为另一个选择(不确定您到底想要什么),您可以声明字段,而不必立即对其进行初始化。

    • 我试图在OpenAPI 3中定义一个查询对象: 但示例值和架构未显示在 Swaager UI 中。 是有错误还是我错过了什么?

    • Kotlin 用对象表达式和对象声明来实现创建一个对某个类做了轻微改动的类的对象,且不需要去声明一个新的子类。 对象表达式 通过对象表达式实现一个匿名内部类的对象用于方法的参数中: window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { //