【问题标题】:Can you tell if a function is pure virtual at runtime in c++你能在 C++ 中判断一个函数在运行时是否是纯虚函数吗
【发布时间】:2015-05-03 16:52:12
【问题描述】:

我遇到了一个非常零星的错误,其中虚拟函数在运行时看起来已经变得“纯”。一定是内存损坏,显然对象没有被销毁,但它可能在某个地方被覆盖了。

调试器将虚函数列表中的一个指针显示为 NULL。

问题是,您能否在运行时判断函数是否 == NULL?

&(object->function)==NULL

给出编译错误 "对绑定成员函数表达式的非法操作"

编辑: 有了这句话,我想做的是在崩溃点之前进行一些检查,看看我是否可以在运行时拦截情况(函数地址为 0x00000000)。显示代码会有点长,因为有问题的函数的对象可能已经存在了一段时间并且经历了许多过程,所以我不指望能解决实际问题。我只是想知道我是否可以进行一些测试以及早发现损坏(该错误非常零星)

【问题讨论】:

  • 对我来说听起来像是 XY 问题 :)
  • 我不太明白这个问题.. 如果我明白了,我会开始想“这家伙做错了什么”。你能再贴一些代码来说明清楚吗?
  • @orlp 是的,比如自动析构函数调用已删除的对象等。
  • 当基类ctor和dtor运行时,虚函数调用基类方法。
  • 你试过valgrind吗?您可能在某处发生了一些内存损坏。

标签: c++ pure-virtual


【解决方案1】:

如果在派生类(实现虚函数的类)构建之前或销毁之后调用虚函数,就会调用纯虚函数。形式上,这也会导致未定义的行为。您也许可以添加在具体派生类的ctor中设置的标志并在dtor中重置,然后检查该标志,尽管这是一个丑陋的hack。您也可以使用 typeid 检查类型,但该方法更复杂,因此更可能导致进一步的问题。

但有一个建议:您应该系统地确保将来不会发生此类问题。有时,为了保证代码正确,绕个小弯路是值得的!

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多