2012-09-18 55 views
1

我没有出车祸,从我的日志:奇怪段违规

15:21:12 1645 Wrk-0.14 | *** Break ***: segmentation violation 

堆栈跟踪是:

=========================================================== 
There was a crash. 
This is the entire stack trace of all threads: 
=========================================================== 
... 
#4 <signal handler called> 
#5 0x00002b5eeef98865 in HiggsSelector::RejectBadJet (this=0x1de241a0, 
    index_jet=0, index_leading=0, index_subleading=1) at HiggsSelector.C:2375 

的功能是:

bool HiggsSelector::RejectBadJet(int index_jet, int index_leading, int index_subleading) const 
{ 
    assert(index_jet >= 0); 
    assert(index_leading >= 0); 
    assert(index_subleading >= 0); 
    assert(PV_z); 
    int index_PV_ID_chosen=0; //<-----in your header 
    double DiPhoton_zcommon=z_common_corrected(index_leading,index_subleading,false); 
    float minimal_distance=9999; 
    for (unsigned int index_PV=0;index_PV<PV_z->size()-1;index_PV++) { 
     if (fabs((*PV_z)[index_PV]-DiPhoton_zcommon)<minimal_distance) { 

的最后一行是号码2375.我真的不知道这次撞车是如何发生的,我想我已经用assert来检查一切。 PV_z*std::vector<float>

+0

只是好奇,如果你通过(PV_z->(index_PV)''来访问该数组会发生什么? – chrisaycock

+3

指针可以是'> = 0',但可以同时被删除 - 如果它在删除后没有被设置为NULL。那么你会犯一个访问冲突。 –

+2

检查指针是否有效,而不仅仅是指针是否为空,如果你删除了PV_z并忘记取消它,它将指向垃圾。 – SingerOfTheFall

回答

2

如果PV_z->size() == 0,然后PV_z->size()-1下溢到UINT_MAX,你可以很容易地得到一个分段冲突,因为for循环条件始终为真。

人去修补方式:

for (unsigned int index_PV=0; !PV_z->empty() && index_PV<PV_z->size()-1;index_PV++) { 
          //^^^^^^^^^^^^^^^^^^ 
1

不要丢弃PV_z指向月球,这将绕过断言。