论坛首页 编程语言技术论坛

什么时候会出现"Pure Virtual Function Call"错误?

浏览 15894 次
精华帖 (0) :: 良好帖 (6) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-03  
C++
我知道普通的Pure virtual function call一般的原因是
1. 基类构造器直接调用虚函数
2. 基类析构器直接调用虚函数
3. 基类构造器间接调用虚函数
4. 基类析构器间接调用虚函数
5. Calling a virtual function via a dangling pointer.

我仔细检查我的基类....构造器和析构器是空的,而且也看到什么dangling pointer...
不知道还有什么情况会导致pure virutla function call, 我的基类就两个virtual function,被都被子类实现了,子类中则访问了基类的一个List属性(非virtual).

除了这五种情况下,还有什么情况会导致pure virtual function call? 或者有没有办法在调用一个function之前检查它是不是virtual...?

这个情况比较特殊的是,我的子类是用C#继承父类的managed c++,所以类的实例化是在另外一个函数(该函数被一个外挂的Host程序所调用)内,通过反射来实现的...(我没办法让直接用new的方法生成,会出现交叉引用)
   发表时间:2008-03-06  
可能的情况你应该列全了 ……

你这个 pure virtual function call 出现在什么时候?构造子类对象?调用子类的某个函数?这种事情只可能在某个对象的内的 vptr 指向抽象基类的 vtable 的时候才会出现,照道理来说,子类只要成功构造就没问题。不过用 C# 来继承 managed C++ 的事情我没干过,加上反射,或许这里构造函数的调用出了点问题。

至于调用一个函数之前检查它是不是 virtual,纯粹的 C++ 你只能自己 hack 对象在内存中的二进制布局,检查 vptr 了。managed C++ …… 哎,我对这个东西没有爱啊,不知道有没有更好一点的手段。

嗯嗯,找到问题原因的话,别忘了说一下。
0 请登录后投票
   发表时间:2008-03-06  
记得以前朋友曾遇到这个错误,不过没有时间让我查找原因。
在单线程程序中,这种错误应该是比较确定的,容易看出问题所在。
可是当时错误是出现在并行程序中,是偶发的。就难找了,我很怀疑是因为对象生命周期管理没设计好,或者没做好同步,抽象类析构干的事情太多(会wait..delay...等),正巧这个时候指针被另一个线程使用
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics