SEGFAULT - 在C ++纯虚拟机上。为什么?

时间:2011-04-05 06:10:54

标签: c++ segmentation-fault access-violation virtual-functions vtable

我通过C代码传递一个纯虚基类指针作为void *

当我在C ++中取消引用基类时,调试器能够访问其所有成员。但是,当我尝试访问纯虚拟功能时,会出现SEGFAULTs / Access Violation。 “无法访问0xc处的内存”调试器说(当我尝试访问纯虚函数时)。

可能在构造函数返回之前调用该函数,这有关系吗?我还应该寻找什么?所有其他变量似乎都完好无损。

代码:

the_socket_base* thisptr = reinterpret_cast<the_socket_base*>(watcher->data);  
thisptr->CallPureVirtualFunction();  
delete thisptr;
thisptr->CallSecondPureVirtualFunction();  //OOPS! It crashed
...  
watcher->data = this; // Associate socket with the watcher (Where 'this' is the base class)  
// NOTE THAT THE ABOVE ALWAYS HAPPENS IN THE CONSTRUCTOR

更新:代码部分正在运行,我怀疑该对象被删除了。因为它运行读取处理程序(可以自行删除),然后运行写入处理程序而不检查......所以这可能就是它。


答案

最终更新:我想澄清基思的评论是否正确。我删除了一个对象并在删除后尝试访问它。很简单的错误! delete this;是一个棘手的陷阱。感谢所有评论。

2 个答案:

答案 0 :(得分:2)

没有代码,很难说。两种可能性OTOH:

  • 您直接或间接地从构造函数或析构函数调用虚函数 - 您不能这样做。
  • 您正在使用多重继承 - 并且您通过void *中断<* li>

答案 1 :(得分:0)

delete this; // Is dangerous, use with care

我在做的是删除这个;在纯虚函数中,立即返回,然后在已删除的对象上调用另一个纯虚函数。

  • 当对象已被删除时,纯虚拟vtable将失败