c++ - 我如何使用 unique_ptr 和 make_unique 正确声明对象数组

标签 c++ smart-pointers

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

};

收到的错误:

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]>;

最佳答案

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

  2. 如果你真的想用std::unique_ptr来存储多维数组,你需要做一些额外的工作,使用一维数组,然后计算偏移量自己为多维索引(例如 [1][2] 变成 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;

关于c++ - 我如何使用 unique_ptr 和 make_unique 正确声明对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57138380/

相关文章:

boost 信号 - 如何控制发送给订阅者的对象的生命周期?智能指针?

c++ - C++ 中的智能指针入门

c++ - 在 C++ 中使用 unique_ptr 的工厂模式

C++:在 HashMap 中查找子字符串

c++ - C++中std::multiset::count的时间复杂度是多少?

C++ : In how many ways compiler optimizes away our code?

c++ - 如何在声明后为 unique_ptr 赋值?

c++ - 如何在 C++ 中重载运算符 ->*

c++ - 关于ifstream on own executable的问题

c++ - 获取 'ones' 数字在 C float 的 base-2 表示中的位置