wntdll.pdb 未加载 - 看不到异常

新手上路,请多包涵

有时当我退出我的应用程序(运行我正在制作的 DLL 的 SaviHOST)时,我会显示此屏幕:

在此处输入图像描述

不幸的是,我不知道错误发生在哪里,因为它只是加载该屏幕,而不是发生异常的行。

我怎样才能解决这个问题? wntdll.pdb 与此有什么关系?谢谢

原文由 markzzz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 962
1 个回答

我在使用非基于 Web 的应用程序时遇到了同样的问题。把我的头发拉出来,但事实证明这是我的一个类的析构函数中的一个小的逻辑和语法错误。这是代码:

 // Constructor //
StatusTrigger_Manager::StatusTrigger_Manager( bool isCreator,unsigned short desiredMemberCount )
{
    maxMembers = desiredMemberCount;
    memberHoldersRequired = ( maxMembers / 32 ) + 1;
    memberHolders = new unsigned int[ memberHoldersRequired ];
    for ( unsigned short index = 0; index < memberHoldersRequired; index++ )
    {
        memberHolders[ index ] = 0;
    }
    //
    if ( isCreator )
    {
        stringList = new STRINGLIST_STATUSTRIGGERS[ maxMembers ];
        // Initialize 'stringList' members to default names
        unsigned char memberName_ValueOffset = 7;
        for ( unsigned int index = 0; index < maxMembers; index++ )
        {
            // Set current member name to default
            stringList[ index ].memberName = new char[ 14 ] { "Member_00000\0" };
            unsigned short individualVal =     0;
            unsigned short    valDivider = 10000;
            unsigned int tempIndex = index;
            for( unsigned char i = 0; i < 5; i++ )                  {
                individualVal = ( index / valDivider ) + 48;
                stringList[ index ].memberName[ i + memberName_ValueOffset ] = individualVal;
                tempIndex -= ( individualVal - 48 ) * valDivider;
                valDivider /= 10;                                   }
            tempIndex = 0;
        }
    }
    else
        stringList = nullptr;
}

// Destructor //
StatusTrigger_Manager::~StatusTrigger_Manager()
{
    if ( stringList != nullptr )
    {
        delete[] &stringList[ 0 ].memberName;
        stringList[ 0 ].memberName = nullptr;
    }
    if ( memberHoldersRequired == 1 )
        delete memberHolders;
    else if ( memberHolders != 0 )
        delete[] memberHolders;
}

这是修正 dll 问题和内存泄漏问题的修正后的析构函数。小变化 - 但头发现在又长回来了。

 // Destructor //
StatusTrigger_Manager::~StatusTrigger_Manager()
{
    if ( stringList != nullptr )
    {
        for ( unsigned int index = 0; index < maxMembers; index++ )
        {
            delete[] stringList[ index ].memberName;
            stringList[ index ].memberName = nullptr;
        }
    }
    if ( memberHoldersRequired == 1 )
        delete memberHolders;
    else if ( memberHolders != 0 )
        delete[] memberHolders;
}

当在调试模式下没有发生同样的问题时,我得到了线索 - 通常是由于变量未初始化而仅在调试模式下设置为默认值,或者在我的经验中未能正确删除数组。希望能帮助到你。祝你好运。

原文由 Jonathan Deans 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题