我目前有一个小型的OpenGL项目,其中我在堆上创建了一个数组,
float* vertices = new float[48] {
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // front top right, 0
0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // front bottom right, 1
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, // front bottom left, 2
-0.5f, 0.5f, 0.5f, 0.4f, 0.8f, 0.2f, // front top left, 3
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, // back top right, 4
0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // back bottom right, 5
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // back bottom left, 6
-0.5f, 0.5f, -0.5f, 0.4f, 0.8f, 0.2f // back top left, 7
};
我期望将其扩展到数百或一千个值。因此,我想使用std::unique_ptr
。我看过文档,似乎不可能像原始数组指针一样初始化std::unique_ptr
。尽管如此,我还是尝试写这样的东西,
std::unique_ptr<float[]> vertices(new float[48]) {
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // front top right, 0
0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // front bottom right, 1
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, // front bottom left, 2
-0.5f, 0.5f, 0.5f, 0.4f, 0.8f, 0.2f, // front top left, 3
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, // back top right, 4
0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // back bottom right, 5
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // back bottom left, 6
-0.5f, 0.5f, -0.5f, 0.4f, 0.8f, 0.2f // back top left, 7
};
无法编译。
是否像原始指针数组一样初始化unique_ptr
数组?
我还考虑过使用std::vector
,然后使用unique_ptr
“捕获”它,尽管我还没有尝试过。
答案 0 :(得分:4)
除非有特殊原因,否则您应该使用std::vector
。这是动态分配数组的标准类型。 my_vector.data()
返回指向数据的指针,以便与OpenGL等C api兼容。
// on the heap
std::vector<float> vertices = {
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // front top right, 0
0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // front bottom right, 1
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, // front bottom left, 2
-0.5f, 0.5f, 0.5f, 0.4f, 0.8f, 0.2f, // front top left, 3
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, // back top right, 4
0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // back bottom right, 5
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // back bottom left, 6
-0.5f, 0.5f, -0.5f, 0.4f, 0.8f, 0.2f // back top left, 7
};
如果要使用向量(如果需要调整大小等),只需使用std::vector<float>
作为类型,而不用std::array<float, 48>
现在,如果您想修复语法但仍使用动态内存和指针(我建议您这样做,因为它适用于OpenGL顶点,并且您事先知道大小,我对此建议更多),只需替换类型,并使用新数组构造它内部:
std::unique_ptr<float[]> vertices(new float[48] {
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // front top right, 0
0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // front bottom right, 1
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, // front bottom left, 2
-0.5f, 0.5f, 0.5f, 0.4f, 0.8f, 0.2f, // front top left, 3
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, // back top right, 4
0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // back bottom right, 5
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // back bottom left, 6
-0.5f, 0.5f, -0.5f, 0.4f, 0.8f, 0.2f // back top left, 7
});
std::unique_ptr
类型具有一个构造函数,该构造函数采用指向类型T
的指针。构造函数仅是显式的,因此只能使用直接初始化。
这是所有构造函数类型的live example。