代码之家  ›  专栏  ›  技术社区  ›  Rugbrød

排除外部错误R6025-纯虚拟函数调用的故障

  •  1
  • Rugbrød  · 技术社区  · 6 年前

    我有一个vs2017.net程序已经开始崩溃,并显示以下对话消息:


    Microsoft Visual C++ Runtime Library
    
    Runtime Error!
    
    Program: [program.exe]
    
    R6025
    -pure virtual function call
    

    此对话框在我的程序外生成。

    当我在VS2017中调试程序时,稍后会出现对话框,但程序仍在正常运行。 只有单击“确定”后,程序才会停止。我得到了对appdomain.currentdomain.processexit的调用,但是没有关于是什么导致程序退出的信息。

    Windows事件日志显示所涉及的dll之一是msvcr110.dll:

    Faulting application name: XXX.exe, version: 1.0.0.0, time stamp: 0x5c4aecde
    Faulting module name: MSVCR110.dll, version: 11.0.51106.1, time stamp: 0x5098858e
    Exception code: 0x40000015
    Fault offset: 0x000a327c
    Faulting process id: 0x128c
    Faulting application start time: 0x01d4b6d3eed97aed
    Faulting application path: C:\Users\dkrewind\AppData\Local\Apps\2.0\DBXO5LPH.PYZ\PTX522V3.2EO\insq..tion_1733f97596464edb_0001.0000_013e50ce80c4530d\XXX.exe
    Faulting module path: C:\Windows\system32\MSVCR110.dll
    

    如何进一步了解此错误?有没有可能找出导致撞车的非法电话的来源? 程序解决方案有几个第三方DLL以及一些C++项目。

    1 回复  |  直到 6 年前
        1
  •  0
  •   MSalters    6 年前

    您看到的是虚拟调用的“默认处理程序”。

    在C++中,A 纯虚拟 函数的定义如下 virtual void foo() = 0 . 具有纯虚拟函数的类不能单独实例化,但它可以是基类。派生类必须重写纯虚拟函数。

    现在在C++中,在派生类的构造过程中,对象的类型随着构造函数的运行而改变。基类ctor首先运行,在此阶段中,对象的类型仍然是基类型。这意味着不允许调用纯虚拟函数;只有在派生ctor运行时,派生类的重写才可用。这是有道理的;重写很可能需要尚未初始化的派生类的成员。

    VisualC++提供了纯虚函数的占位符函数。这是标准允许的;调用纯虚拟函数是未定义的行为,因此对话框是完全正常的。此时可以附加一个调试器并检查调用堆栈。这应该能直接告诉你电话的来源。