今天一印度哥問我他的C++程序怎麼總是顯示segment fault, 研究了一下發現是數組大小超過了棧大小,於是研究了一下解決方案。共找到4種。
1. 因爲在linux下,最簡單的解決辦法是通過 ulimit 命令重新設定棧大小:
ulimit -a // 查看當前系統的各種大小限制 ulimit -s 32768 // 設置棧大小爲32M
2. 還可以通過利用堆而不通過棧利用更多的內存資源,比如
double *p = new double[1000000000]; double (*p)[100000] = new double[100000][100000];
而非用
double data[1000000000]; double data[100000][100000];
3. 新創建一個thread,在該thread中設置棧大小,然後定義數組大小:
#include <pthread.h> void *test(void *data) { double xx=[1000000000]; . . . return NULL; } static int bigstack(void *(*f)(void *), void* data) { pthread_t thread; pthread_attr_t attr; // 設置棧大小爲128M size_t stacksize = 128*1024*1024; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, stacksize); int rc = pthread_create(&thread, &attr, test, data); pthread_join(thread, NULL); return 1; }
使用此種方法時,編譯需要加 -pthread 選項。
4. 也可以直接設置stack大小
#include <sys/resource.h> void *test(void *data) { double xx=[1000000000]; . . . return NULL; } int main() { const rlim_t StackSize = 64*1024*1024; // 設置棧大小爲64M struct rlimit rl; int result; result = getrlimit(RLIMIT_STACK, &rl); if(result == 0) { rl.rlim_cur = StackSize; result = setrlimit(RLIMIT_STACK, &rl); if(result != 0) fprintf(stderr, "setrlimit error! result = %d\n", result); } test(NULL); return 1; }