2012-05-11 48 views
1

我检查时很卡与此恼人的段错误,如果一个指针是0。这是有问题的代码:断言(指针)提高分段违例

bool egammaMVACalib::checkTree() 
{ 
    // Not a TChain 
    cout << "a" << endl; 
    assert(m_tree);  // crash on line 751 (this one) 
    cout << "B" << endl; 

m_tree是类型的egammaMVACalib数据成员TTree*所以我真的不明白为什么assert(m_tree)可以引发分割违规。这与堆栈输出跟踪

a 
19:07:25 30574 Wrk-0.9 | *** Break ***: segmentation violation 

=========================================================== 
There was a crash. 
This is the entire stack trace of all threads: 
=========================================================== 
#0 0x000000361869a4d5 in waitpid() from /lib64/libc.so.6 
#1 0x000000361863c481 in do_system() from /lib64/libc.so.6 
#2 0x00002ac5099cb322 in TUnixSystem::StackTrace()() 
    from /usr/local/proof/root/lib/libCore.so 
#3 0x00002ac5099c7fea in TUnixSystem::DispatchSignals(ESignals)() 
    from /usr/local/proof/root/lib/libCore.so 
#4 <signal handler called> 
#5 egammaMVACalib::checkTree (this=0x0) at ../Root/egammaMVACalib.cxx:751 
#6 0x00002ac5117e5563 in egammaMVACalib::LoadVariables (this=0x1, index=0) 
    at ../Root/egammaMVACalib.cxx:492 

回答

8

如果你看一下帧#5你this指针为空。这意味着问题从那里开始。断言在断言只是repurcusion!

+0

我是在MEM转储盯着有不知道是什么意思,然后你来了,闪耀行,其中之前没有。谢谢。 –

+0

好,但现在,它怎么可能?程序如何用'this == 0'调用对象的方法? (它不是一个静态方法) –

+1

我知道这看起来很奇怪,但方法调用与数据处于不同的空间,并且可以链接到一个代码中,以便知道如何调用该方法 - 我知道这似乎很奇怪,但我已经有了很多。 – Julian

2

的线索是在这里:

#5 egammaMVACalib::checkTree (this=0x0) at ../Root/egammaMVACalib.cxx:751 

此= 0意味着你的对象为空