从基类的对象调用虚函数时出现分段错误

时间:2015-05-09 11:43:25

标签: c++ segmentation-fault lldb virtual-functions

尝试从对象调用虚函数时,我遇到了分段错误(请参阅调试器报告的帖子底部)。我已经阅读了每个stackoverflow的答案以及我找到的每一篇网络文章,但似乎都没有解决或解决手头的问题。

请参阅以下代码(模仿我的代码结构)作为示例:

类声明。

class A{
public:
    A();
    virtual void foo();
};

class B : A{
public:
    B();
};

class C : B{
public:
    C();
    virtual void foo();
};

类实现。

B::B() : A(){

}

C::C() : B(){

}

void A::foo(){

}

void C::foo(){
    // Code specific to class C
}

发生seg错误的函数(向量声明在此处供参考,并在其他地方声明和使用)。

std::vector<B*>* vec = new std::vector<B*>();

void bar(){
    if(vec){
        for(auto it = vec->begin(); it != vec->end(); it++){
            if((*it)){ 
                printf("*it is not null\n");
                (*it)->foo();
                printf("Called B::foo()\n");
            }
        }
    }
}

来自foo()的{​​{1}}来电时发生seg故障。 我已经验证*it不是null,因为第一个调试消息正在打印,而*it确实包含vec类型的元素。我向C :: foo()添加了调试消息,所以我知道它什么时候被调用,但它永远不会,并且C中的第二个调试消息不会被打印。

可能导致seg故障的原因是什么?

LLDB错误报告:

  

流程24504停止   * thread#1:tid = 0x19134f,0x0000000000000000,queue =&#39; com.apple.main-thread&#39;,stop reason = EXC_BAD_ACCESS(code = 1,   地址=为0x0)

     

帧#0:0x0000000000000000

     

错误:0x0

的内存读取失败

修改 测试用例:https://gist.github.com/SamTebbs33/5fe56879dc6a423842ad

出于某种原因,上述测试用例有效,即使它反映了我的代码结构。

编辑2: 使用Valgrind后,我收到以下报告:https://gist.github.com/SamTebbs33/469eefda95a5006abf64

1 个答案:

答案 0 :(得分:-1)

我会尝试动态转换为C指针:

if ((*it)) {
    printf("*it is not null\n");
    dynamic_cast<C*>(*it)->foo();
    printf("Called B::foo()\n");
}

因为没有其他明显的段错误原因。