【发布时间】:2020-05-20 06:06:27
【问题描述】:
如果我尝试在使用 g++ 7.3.1 编译的 Centos 7.6 系统上实例化一个大型二维 std::array,我会遇到分段错误:
int main()
{
const unsigned NUM_BUFFERS = 200;
const unsigned BUFFER_SIZE_BYTES = 1024 * 1024;
std::array<std::array<unsigned char, BUFFER_SIZE_BYTES>, NUM_BUFFERS> buffer;
}
给予:
$ ./main
Segmentation fault (core dumped)
std::array 的长度是否有大小限制?
我已经在堆栈上声明了这个数组,但大概存储在空闲存储上。这里有什么问题?
【问题讨论】:
-
“大概存储在免费商店”也许是时候挑战这个假设了。
-
函数内部的局部变量通常存储在堆栈中。对于数组也是如此,包括旧的 C 样式数组以及
std::array对象。堆栈是有限的资源;例如在Linux 进程的默认堆栈是 8MiB。您尝试创建一个 200MiB 的数组。 -
@DavidA 不,您似乎想要的是
std::vector。如std::vector<std::vector<uint8_t>> buffer(NUM_BUFFERS, std::vector<uint8_t>(BUFFER_SIZE_BYTES)); -
@juanchopanza 我正在编辑代码 sn-p 以显示它在堆栈上。