0

我通过 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;是一个棘手的陷阱。感谢所有的评论。

4

2 回答 2

2

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

  • 您正在从构造函数或析构函数直接或间接调用虚函数 - 您不能这样做。
  • 您正在使用多重继承 - 并且您通过 void * 进行转换
于 2011-04-05T06:13:37.650 回答
0
delete this; // Is dangerous, use with care

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

  • 当对象已被删除时,纯虚拟 vtable 将失败
于 2011-04-05T07:14:57.360 回答