今天一印度哥问我他的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; }