急,在线等!!!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