创建一个大的std :: array导致段错误?

时间:2014-11-13 11:13:10

标签: c++ linux c++11 gcc

我想创建一个大std::array并用随机数据填充它。问题是如果我声明std :: array program segfaults(GDB说它auto start..上的段错误),如果我评论数组声明程序运行。

这是SCSE:

#include <array>
#include <cstdint>
#include <iostream>
#include <chrono>

static const constexpr size_t size = 1E7;

int main(){

    auto start = std::chrono::high_resolution_clock::now();
    std::array<uint16_t, size> random_data;
    // Here I want to fill random_data with random numbers to avoid 
    // filling memory twice
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = end-start;
    std::cout << "Elapsed sec " << elapsed.count() << std::endl;

}

在GNU / Linux上使用-std=gnu++11在gcc中编译。

1 个答案:

答案 0 :(得分:10)

你的array位于堆栈上,其成员,底层数组也是如此。但是你机器上的堆栈大概不是四十兆字节,所以程序崩溃了。

使用vector

std::vector<std::uint16_t> random_data(size);

或者,如果您想避免不必要的初始化并且不需要动态更改大小,请使用unique_ptr持有数组。

std::unique_ptr<std::uint16_t[]> random_data( new std::uint16_t[size] );

Demo