如何通过分配器为int [10] [10]分配内存

时间:2017-04-24 09:55:56

标签: c++ memory-management

我知道如何通过分配器创建一个1d数组(如a[10])。例如,这是来自cppreference的摘要:

#include <memory>
#include <iostream>
#include <string>
int main()
{
    std::allocator<int> a1; // default allocator for ints
    int* a = a1.allocate(10); // space for 10 ints

    a[9] = 7;

    std::cout << a[9] << '\n';
   // the remainder was omitted .....
    return 0;
}

但是,我不知道如何创建像int a[10][10]这样的2D数组。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

int[10][10]是一个包含10个元素的数组类型。元素类型为int[10]。所以相应的分配是:

std::allocator<int[10]> a2;
int (*a)[10] = a2.allocate(10);

您可以使用类型别名简化代码,例如:

using A = int[10];
std::allocator<A> a2;
A *a = a2.allocate(10);

请注意,cppreference示例错误地继续写入a[9] = 7;allocate函数分配存储但不在存储中创建对象。 (标准明确说明了这一点,C ++ 14表28)。将赋值运算符与不指定对象的左侧操作数一起使用是未定义的行为。在使用赋值运算符之前,您需要随后使用placement-new来创建对象。该示例现已修复为使用construct而不是allocate

答案 1 :(得分:0)

您可以使用y * 10 + x分配100并进行访问。这是编译器为[10] [10]

生成索引的方式
int* a = allocate(100);
a[5*10 + 2] = 9; //a[5][2]

答案 2 :(得分:0)

如果数组的大小是固定的,那么你可以简单地写

int a[10][10]; 

并且分配将在本地变量的堆栈上或全局变量的数据或bss段中(取决于您是否初始化数组成员)。

如果要动态分配数组的大小,我建议使用std::vector而不是数组。使用std :: allocator你会写

std::vector<std::vector<int>> a(10, std::vector<int>(10)); 

std::vector也可以使用第二个模板参数来定义与std::allocator不同的分配器。请注意,内存不是连续分配的。

here描述了具有连续数组大小的动态大小的2D数组的可能性。