【问题标题】:How may I properly declare an object array using unique_ptr along with make_unique如何使用 unique_ptr 和 make_unique 正确声明对象数组
【发布时间】:2019-11-29 23:29:06
【问题描述】:

我正在尝试声明和初始化一个 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* operator new ' std::unique_ptr ship_crew_members = std::make_unique;
^
无法基于转换为“std::unique_ptr”类型来解析重载函数“make_unique” std::unique_ptr ship_crew_members = std::make_unique;

【问题讨论】:

  • make_unique 是一个函数模板。你需要做make_unique&lt;Type&gt;()
  • std::make_unique&lt; new CrewMember[3][3]&gt; 90% 肯定你不能在这种情况下使用new
  • 另外,它应该更像std::make_unique&lt;CrewMember[3][3]&gt;(),虽然我不确定这是否完全正确。
  • @L.F.和奇普斯特我会试一试。感谢您的快速回复!
  • 试过这个:cpp std::unique_ptr&lt;CrewMember[3][3]&gt; ship_crew_members = std::make_unique&lt; CrewMember[3][3]&gt;(); 收到pastebin.com/Kma1Q4S8

标签: c++ smart-pointers


【解决方案1】:
  1. std::unique_ptr 存储指向单个对象或一维数组的指针。不支持多维数组。它理论上可以存储一个指向多维数组的指针,如果你做了一个邪恶的演员,但你真的不应该。

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

  3. 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;

【讨论】:

  • 谢谢@MaxVollmer,你帮了我很大的忙!我会把你给我的代码和解释落实到我的项目中!
猜你喜欢
  • 2015-10-19
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多