C++分段错误std::array
C++ Segmentation fault std::array
我的电脑上有大约2 GB的可用DRAM。编译std::数组或标准数组:
#include <iostream>
#include <array>
int main(int argc, char *argv[]){
// int* a = new int[500000000];
std::array<int, 2000000> a;
}
带有:
$ g++ -std=c++11 main.cpp -o main
./main
适用于这两个阵列。将std::数组的大小更改为:
// ceteris paribus
std::array<int, 2095300> a;
导致:
$ ./main
Segmentation fault (core dumped)
老实说,我不确定这个问题是否已经在某个地方得到了解决。
根据我的理解,std::数组是在堆栈上创建的,而int*。。。堆上的数组。现在我的猜测是,也许我的堆栈根本不比~8mb大,与2GB的堆栈相比,这听起来不成比例。因此,我也尝试了:
//int a[2096000];
这也导致分割故障。所以我的问题是,是什么导致了分割错误?
提前谢谢。
您在堆栈上放置了一个大数组,导致堆栈溢出。
您可以设置堆栈的大小:在使用GNU编译器编译期间,更改Linux中C++应用程序的堆栈大小。然而,一个更好的选择可能是使用堆。
堆栈比[sic]堆小得多,这听起来有点不相称。
堆栈是实际分配的内存,这意味着你不希望它比你真正需要的大,因为如果内存用于堆栈,那么它就不能用于其他用途。另一方面,除非实际请求,否则堆不会占用内存,因此允许堆可能占用很大一部分地址空间是可以的。
堆栈通常也不需要很大,因为函数调用的最大深度通常没有那么高。几兆字节几乎总是绰绰有余。
相关文章:
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 标准::unordered_map 中的 std::array 的值初始化
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 如何读/写或遍历 std::array 中的特定元素范围?
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 如何在C++中传递一个大小未知的 std::array?
- 在现代C++中将 std::array<std:::array<T,N>> 转换为 std::vector<T>
- 在 C++ 中访问 std::array<std::array> 元素
- 将标量+std::array+std::tuple转换为一个大元组
- 如何初始化 std::array<std::array<T, 2>, 2> 的对象?
- 初始化 std::p air<double, std::array<std::p air<double, double>, 3> >
- 单独移动数组(raw array, std::array, std::vector)的每个元素
- 包装方法返回 c++ std::array<std::string, 4> in cython