浏览 15894 次
精华帖 (0) :: 良好帖 (6) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-03
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的方法生成,会出现交叉引用) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-03-06
可能的情况你应该列全了 ……
你这个 pure virtual function call 出现在什么时候?构造子类对象?调用子类的某个函数?这种事情只可能在某个对象的内的 vptr 指向抽象基类的 vtable 的时候才会出现,照道理来说,子类只要成功构造就没问题。不过用 C# 来继承 managed C++ 的事情我没干过,加上反射,或许这里构造函数的调用出了点问题。 至于调用一个函数之前检查它是不是 virtual,纯粹的 C++ 你只能自己 hack 对象在内存中的二进制布局,检查 vptr 了。managed C++ …… 哎,我对这个东西没有爱啊,不知道有没有更好一点的手段。 嗯嗯,找到问题原因的话,别忘了说一下。 |
|
返回顶楼 | |
发表时间:2008-03-06
记得以前朋友曾遇到这个错误,不过没有时间让我查找原因。
在单线程程序中,这种错误应该是比较确定的,容易看出问题所在。 可是当时错误是出现在并行程序中,是偶发的。就难找了,我很怀疑是因为对象生命周期管理没设计好,或者没做好同步,抽象类析构干的事情太多(会wait..delay...等),正巧这个时候指针被另一个线程使用 |
|
返回顶楼 | |