尝试从对象调用虚函数时,我遇到了分段错误(请参阅调试器报告的帖子底部)。我已经阅读了每个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
答案 0 :(得分:-1)
我会尝试动态转换为C指针:
if ((*it)) {
printf("*it is not null\n");
dynamic_cast<C*>(*it)->foo();
printf("Called B::foo()\n");
}
因为没有其他明显的段错误原因。