如何将内存静态分配给指向结构的指针数组

时间:2019-05-04 19:32:02

标签: c++ memory

我正在尝试将内存静态分配给指向名为“ mini”的结构的指针数组。 “ mini”结构用作存储索引和数据的一种方式,因此我可以通过对指向该结构的指针进行排序来进行间接排序。当我声明数组时,为数组分配了用于存储指针的内存,但是指针本身并未为“ mini”结构分配任何内存。静态分配很重要,因为它是排序算法的一部分,因此,我在尝试避免动态分配内存。

这是mini的声明和一个指向mini的指针的数组:

typedef struct {
    long long index;
    string data;
} mini;

static mini* ssn[1010000];

我可以动态分配如下:

for (int j = 0; j < 1010000; j++){
    ssn[j] = new mini();
}

当我尝试为每个指针静态分配内存时,就会出现问题。这是我尝试过的一些事情:

static mini* ssn[1010000] = {{0,""}};

static mini* ssn[1010000]  = {{new mini()}};

这些都不成功编译。 有什么方法可以为数组中的每个指针静态分配内存吗?

1 个答案:

答案 0 :(得分:0)

您有一个指针数组,并且想要使用其他值(分配结果)初始化该数组(每个指针元素)。除了为每个元素提供值之外,无法对声明进行此类初始化:

static mini* ssn[4] = {new mini(), new mini(), new mini()};

每个您尚未提供值的元素都将使用默认值0进行初始化。

如果需要定长数组,最好使用std::array。 C ++具有强大的类型系统,请使用它。在这种情况下,初始化可以通用化:

struct Mini {
    int x;
};

template <class Ar, class F, size_t... I>
static auto init(F factory, std::index_sequence<I...>) noexcept {
    return Ar{factory(I)...};
}

using Array = std::array<Mini*, 20>;
static Array ssr(init<Array>([](...) { return new Mini(); }, std::make_index_sequence<20>()));

实际上是相同的:

static Array ssr(Array{new Mini(), new Mini(), ...})

编译器将优化Array副本。请注意,此解决方案需要c ++ 14,尽管它可以适应c ++ 11。