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

标签 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

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


回答

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

最佳答案

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

  • 您直接或间接从构造函数或析构函数调用虚函数 - 您不能那样做。
  • 您正在使用多重继承 - 并且您通过 void * 进行的转换中断了

关于c++ - SEGFAULT - 在 C++ 纯虚拟机上。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5547911/

相关文章:

Java - Android 致命信号 11 SIGSEGV

c++ - 使用 C++ 复制而不是 memcpy 的段错误

c++ - 加载c++ dll文件时如何修复EXCEPTION_ACCESS_VIOLATION?

delphi - 使用 Windows 文件对话框时在奇怪的地方访问冲突

c++ - boost 库更新后模板函数调用不起作用

c++ - WPD 获取媒体尺寸

C++::Boost::Regex 迭代子匹配

c++ - 如何在编译时初始化一个 constexpr 多维数组?

python - 从 Python 中使用 OpenMP 调用 C 函数会导致最后出现段错误

C++可能的构造函数错误违规写入位置