大数组情况下栈溢出解决 原

今天一印度哥问我他的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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章