大数组情况下栈溢出解决

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

转载于:https://my.oschina.net/propagator/blog/849944

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值