C++ stack overflow

cherish_1234 2016-06-15 10:11:01
直接上代码背景:

首先我定义了个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对象,不懂为什么会针对它报错。

而且,求问各位大大,这个该怎么修改?
...全文
346 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cherish_1234 2016-07-02
  • 打赏
  • 举报
回复
不好意思,过了这么长时间才来结贴,我把最终找到的原因和解决方法说下吧。 fv是指向FeatureVector对象的指针,将它作为参数传参,确实没问题,这点是肯定的。 myFV这个结构体正如6楼分析的,new一个这个类型的数组就占据了1.2G的堆内存。 虽然我的电脑内存是8G的,但是一次性分配这么多内存给一个数组是会出问题的std::bad_alloc,无法申请完整的内存。我也试过malloc,但还是会报错std::bad_alloc。 因此我将myFV featureVector[10000][10000]改成了int featureVector[10000][10000]。依然作为成员变量,可是依然报stack overflow的错。原因如下: int featureVector[10000][10000]占据的栈大小为 10000*10000*4/1024=381M,可依然报overflow的错。因为runAlgorithm()函数里我也定义了一个int featureVector[10000][10000],由于函数里的变量是静态存在的,在运行之前就存在,所以当B类里的featureVector声明并占据了一定的内存之后(此时没有报错),再次在runAlgorithm()里声明了同样大小的变量,栈自然就放不下。 于是我将int featureVector[10000][10000]改为了char featureVector[10000][10000],缩小了四倍,并且在runAlgorithm()里改为

char **featureVector;
featureVector= (char**)malloc(sizeof(Function)*entity.size());
使用指针,在堆上分配内存。就OK了。
paschen 版主 2016-06-16
  • 打赏
  • 举报
回复
太大的数组就不要在栈上分配,在堆上动态分配内存
赵4老师 2016-06-16
  • 打赏
  • 举报
回复
用文件读写模拟内存读写。 参考_fseeki64
小灸舞 2016-06-16
  • 打赏
  • 举报
回复
你类里面的成员 myFV featureVector[10000][10000];栈空间肯定是不够的,只能new
你这个myFV 占12字节, 所以new一个对象至少需要10000*10000*sizeof(myFV )/1024/1024/1024=1.12G

std::bad_alloc异常的发生一是内存不足,二是内存碎片太多,导致无法申请所需的完整内存。
1. 判断是否内存泄露
2. 判断是否死循环
cherish_1234 2016-06-15
  • 打赏
  • 举报
回复
引用 4 楼 lunat 的回复:
是不是递归层次太多?或者死循环递归? 你既然知道是运行到哪个函数出错的,何不跟进去呢? 你用的是不是vs?出错后中断下来可以看到线程堆栈的。
还没有进入函数就报错了,而且函数中无任何递归,只有循环。 哦我后来发现,只要在B类中使用fv就会,即使是把fv随便赋值给另个变量,都会报stack overflow的错,所以和runAlgorithm函数无关。 但如果使用new的话,像下面这样
[code=c]
FeatureVector* fv=new FeatureVector();
fv=A();

[/code] 又会报 std::bad_alloc的错。。。 所以这种new方法也不行。。。
lunat 2016-06-15
  • 打赏
  • 举报
回复
是不是递归层次太多?或者死循环递归? 你既然知道是运行到哪个函数出错的,何不跟进去呢? 你用的是不是vs?出错后中断下来可以看到线程堆栈的。
cherish_1234 2016-06-15
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
没有看到关键代码..
关键在于 fv是指向FeatureVector对象的指针,这个对象的size很大 然后调用函数runAlgorithm(fv)时,将指针fv传参进去,运行到这函数时,程序就报 stack overflow的错了 求解答!!
cherish_1234 2016-06-15
  • 打赏
  • 举报
回复
关键在于 fv是指向FeatureVector对象的指针,这个对象的size很大 然后调用函数runAlgorithm(fv)时,将指针fv传参进去,运行到这函数时,程序就报 stack overflow的错了 求解答!!
dustpg 2016-06-15
  • 打赏
  • 举报
回复
没有看到关键代码..

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧