首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

急g++ segmentation fault

2012-05-21 
急,在线等!!!g++ segmentation fault各位大神:我改写我导师的工程出现了一个segmentation fault。 gdb调试

急,在线等!!!g++ segmentation fault
各位大神:
我改写我导师的工程出现了一个segmentation fault。 gdb调试的结果显示

C/C++ code
//错误信息://Program received signal SIGSEGV, Segmentation fault.//0x08056120 in RTree::bbs_skyband (this=0x8069088, _hp=0x8066e08, //    _rslt=0xb7f24008, _rsltcnt=@0xbfffefac, _bounces=0x8066e20, _k=3)//    at ./rtree/rtree.cpp:1602//1602                    tmp_bounces[j] = _rslt[i * dimension + j];float *_rslt, int &_rsltcnt //我添加函数时传入的参数。应该没有问题因为别的函数也是这么用的,没有出现问题。float *tmp_bounces = new float[dimension];//我自己new的一个dimension大小的float指针            for (int i = 0; i< dimension; i++)//给指针指向空间初始化                tmp_bounces[i] = 0.0;//此处省略部分代码                         for(i=0;i<_rsltcnt;i++)//_rsltcnt初始化0            {              for(j=0;j<dimension;j++)                              {                tmp_bounces[j] = _rslt[i * dimension + j];              }//省略部分往_rslt[dimension * _rsltcnt]中加入内容的代码。            }            cnt = 0;//reset   

我的问题是,为什么在tmp_bounces[j] = _rslt[i * dimension + j];会有SF呢?
我在测试的数据集增加到64K过后,就会出现这个问题,当小数据集的时候,就没有这个问题。

在线等!!!!!

[解决办法]
你确信出错是 _rsltcnt 的为0吗?从逻辑上将,如果_rsltcnt =0,那么这个2重循环根本就不会执行。

调式一下你的程序,如果不方便的化,打印log,看看出错的时候,dimension,rsltcnt的值是多少。
可以肯定的说,你的程序写内存越界了,分配了100个单位,却要写第200个单元。
[解决办法]
我感觉是这个问题,首先你传入的float *_rslt只是个值参,

其次,中间会改变_rslt指向的内存大小,这样如果扩展过大,没有连续内存块时,会整个拷贝搬移到另一处,原指针会变

最后,你用原来的_rslt来访问已经不属于你的内存,导致SF

热点排行