奇怪段违规
问题描述:
我没有出车祸,从我的日志:奇怪段违规
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>
答
如果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++) {
//^^^^^^^^^^^^^^^^^^
答
不要丢弃PV_z指向月球,这将绕过断言。
只是好奇,如果你通过(PV_z->(index_PV)''来访问该数组会发生什么? – chrisaycock
指针可以是'> = 0',但可以同时被删除 - 如果它在删除后没有被设置为NULL。那么你会犯一个访问冲突。 –
检查指针是否有效,而不仅仅是指针是否为空,如果你删除了PV_z并忘记取消它,它将指向垃圾。 – SingerOfTheFall