我正在通过 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
更新:代码部分有效,我怀疑对象被删除了。因为它运行读取处理程序(可以删除自身),然后它运行写入处理程序而不检查...所以这可能就是它的原因。
回答
最后更新:我想澄清一下 Keith 的评论是正确的。我正在删除一个对象并在删除后尝试访问它。很简单的错误! delete this;
是一个棘手的陷阱。感谢所有评论。
最佳答案
没有代码,很难说。 OTOH 的两种可能性:
- 您直接或间接从构造函数或析构函数调用虚函数 - 您不能那样做。
- 您正在使用多重继承 - 并且您通过 void * 进行的转换中断了
关于c++ - SEGFAULT - 在 C++ 纯虚拟机上。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5547911/