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

jb.*_*jb. 3 c++ linux gcc c++11

我想创建一个大的std::array并用随机数据填充它.问题是如果我声明std :: array program segfaults(GDB说它是segfaults 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;

}
Run Code Online (Sandbox Code Playgroud)

它是-std=gnu++11在GNU/Linux上使用gcc编译的.

Col*_*mbo 10

你的array谎言在堆栈上,它的成员,底层数组也是如此.但是你机器上的堆栈大概不是四十兆字节,所以你的程序崩溃了.

使用vector.

std::vector<std::uint16_t> random_data(size);
Run Code Online (Sandbox Code Playgroud)

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

std::unique_ptr<std::uint16_t[]> random_data( new std::uint16_t[size] );
Run Code Online (Sandbox Code Playgroud)

演示.