簡體   English   中英

C ++分段錯誤std :: array

[英]C++ Segmentation fault std::array

我大約。 我的計算機上有2 GB的免費DRAM。 編譯std :: array或標准數組:

#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 :: array的大小更改為:

// ceteris paribus 
std::array<int, 2095300> a; 

導致:

$ ./main
Segmentation fault (core dumped) 

老實說,我不確定這個問題是否已經解決。

據我了解,std :: array是在堆棧上創建的,int * ...數組是在堆棧上創建的。 現在我的猜測是,也許我的堆棧不會比〜8mb大,而與2 GB的堆相比聽起來不相稱。 因此我也嘗試了:

//int a[2096000];

這也會導致分段錯誤。 所以我的問題是,導致細分錯誤的原因是什么?

先感謝您。

您正在堆棧上放置一個大數組,導致堆棧溢出。

您可以設置堆棧的大小在使用GNU編譯器進行編譯的過程中,更改Linux中C ++應用程序的堆棧大小 但是,更好的選擇可能是使用堆。

它只是聽起來有點不相稱,所述堆棧是如此小得多然后[原文如此]堆。

堆棧是實際分配的內存,這意味着您不希望它大於實際需要的容量,因為如果將內存用於堆棧,則它將無法用於其他用途。 另一方面,除非實際請求堆,否則堆不會占用內存,因此允許堆潛在地占用地址空間的很大一部分就可以了。

通常,堆棧也不需要太大,因為函數調用的最大深度通常不會那么高。 幾兆字節幾乎總是綽綽有余。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM