本文主要是介绍C++未经处理的异常...stackoverflow(参数: 0x0000000000000001...)-- 分配大内存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天碰到一个问题
c++编译时一切正常,运行时出错
0x00007FF6925BE108 处有未经处理的异常(在 AutoProject.exe 中): 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000E3CE403000)。
Unhandled exception at 。。。。。 : Stack overflow (parameters: 0x0000000000000001。。。。。
然后调试发现,是预定义的数组太大了,我这个数组只定义了大约1M
void write(){char writeBuffer[1048576]; // 1 MBytes....
}
如果要继续使用这样的大数组的话,当然可以根据new, delete来创建数组,
void write(){char writeBuffer* = new char[1048576]; // 1 MBytes....delete[] writeBuffer;
}
还有一种解决方式,尤其是函数调用频繁的时候,可以把该数组定义成全局变量,这样效率会比较高
char writeBuffer[1048576]; // 1 MBytes
void write(){ ....
}
第三种方法就是调整编译器的预定义设置,这种方式会对所有一起编译的项目都带来影响,所以通常情况不推荐这样做。
另外转一个别人的内存分配的帖子:
https://blog.csdn.net/czy47/article/details/80943740
C++中超大数组的空间分配
在C或者C++中,在函数(包括main函数)中定义数组,对于任何程序员来说都是so easy的事,当然这通常是对于一些容量小的数据;当我们有大量的数据需要处理的时候,比如1GB大小的数据,按照常规的方式在函数中定义数组空间,往往会运行出错,那么如何解决这样的问题呢?
在这里大家需要了解一点的是,C++中,在函数(包括main函数)中定义超大数组,内存为栈所分配的最大空间为4M,因此在子函数或者main函数中定义超大数组的方式是万万行不通的。
解决方式:为超大数组创建为一个全局数组。
有时候觉得数组使用起来不方便,可以采用定义vector的方式,但需要注意的是,vector通常只能分配出几百MB的空间。
vector <char> vec0;
vector <string> vec1;
vector <int> vec2;
vector <double> vec3;
cout<<vec0.max_size()<<endl;
cout<<vec1.max_size()<<endl;
cout<<vec2.max_size()<<endl;
cout<<vec3.max_size()<<endl;
//注意max_size()函数返回的是vector容器最大能存放的元素的个数,并不是字节数
在程序运行完之后得到的数据如下(win7系统 64位 VS2010下):
vec0 时为4294967295,即4G个元素
vec1 时为134217727,即128M个元素
vec2 时为1073741823,即1G个元素
vec3 时为536870911,即512M个元素
至于为何元素类型不同,返回的元素个数不同,我也不是很清楚,在这里给大家说一下。
此外,虽然上面显示了可以存放这么多数量的元素个数,但是一般情况下并不会真的让你存放这么多的数据。
由于vector在所需要的是一片连续的内存空间,有时候并不能实现,但是C++中 list 可以使用散列的空间,需要存放较大数据时可以使用 list 容器来存放数据。
这篇关于C++未经处理的异常...stackoverflow(参数: 0x0000000000000001...)-- 分配大内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!