【问题标题】:assert(pointer) raise a segmentation violation断言(指针)引发分段违规
【发布时间】:2012-05-11 17:20:08
【问题描述】:

在检查指针是否为 0 时,我遇到了这个烦人的分段错误。这是有问题的代码:

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

m_treeegammaMVACalib 类型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

【问题讨论】:

    标签: c++ crash segmentation-fault


    【解决方案1】:

    如果您查看第 5 帧,您的 this 指针为空。这意味着问题从那里开始。断言中的 Seg 错误仅仅是对它的反作用!

    【讨论】:

    • 我盯着内存转储,不知道它是什么意思,然后你过来,在没有的地方发光。谢谢。
    • 好的,但是现在,怎么可能?程序如何调用带有this==0的对象的方法? (它不是静态方法)
    • 我知道这看起来很奇怪,但是方法调用与数据位于不同的空间,并且可以链接到其中,因此您可以获得一段知道如何调用该方法的代码 - 我知道看起来很奇怪,但我已经吃过很多次了。
    【解决方案2】:

    线索在这里:

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

    this=0 表示您的对象为空

    【讨论】:

      猜你喜欢
      • 2016-03-18
      • 2016-04-14
      • 2020-04-29
      • 2018-11-23
      • 2017-11-03
      • 2018-10-25
      • 2020-12-24
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多