C++ stack overflow

C++语言 码拜 9年前 (2016-04-05) 1290次浏览
直接上代码背景:
首先本人定义了个FeatureVector类

class FeatureVector
{
public:
	vector<Function*> entities;
	vector<string> features;
	myFV featureVector[10000][10000];
	FeatureVector();
	~FeatureVector();
};
typedef struct
{
	bool isClustered;
	int clusterNum;
	int value;
}myFV;

此类的entities、features和featureVector容量都很大,都是几千到上万的size。
然后函数A,A定义:

FeatureVector* A(){
}

在类B里定义了成员变量
FeatureVector* fv;
fv=A();
并在B的成员函数里将fv作为参数传递进去
runAlgorithm(fv);
当运行到runAlgorithm(fv);这句时,程序报错 Stack Overflow
本人查找了各种原因,肯定是原因是fv是存储于栈上,但是栈的空间不够全部报错的
但是fv只是作为指针实参传递进去,并不是真正占据很大内存的FeatureVector对象,不懂为什么会针对它报错。
而且,求问各位大大,这个该怎么修改?

解决方案

20

是不是递归层次太多?或死循环递归?
你既然知道是运行到哪个函数出错的,何不跟进去呢?
你用的是不是vs?出错后中断下来可以看到线程堆栈的。

40

你类里面的成员 myFV featureVector[10000][10000];栈空间肯定是不够的,只能new
你这个myFV 占12字节, 所以new一个对象至少需要10000*10000*sizeof(myFV )/1024/1024/1024=1.12G
std::bad_alloc异常的发生一是内存不足,二是内存碎片太多,导致无法申请所需的完整内存。
1. 判断能否内存泄露
2. 判断能否死循环

5

用文件读写模拟内存读写。
参考_fseeki64

10

太大的数组就不要在栈上分配,在堆上动态分配内存

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++ stack overflow
喜欢 (0)
[1034331897@qq.com]
分享 (0)