大數組情況下棧溢出解決 原

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