Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC对话框成员变量的随机崩溃不在范围内_C++_Mfc_Dialog_Scope - Fatal编程技术网

C++ MFC对话框成员变量的随机崩溃不在范围内

C++ MFC对话框成员变量的随机崩溃不在范围内,c++,mfc,dialog,scope,C++,Mfc,Dialog,Scope,我有一个带有属性窗口的MFC应用程序。I属性窗口我已经实现了一个定制的CMFCPropertyGridProperty,这样每当用户单击添加到该属性中的按钮时,就会弹出另一个对话框 void CMFCPropertyGridCustomProperty::OnClickButton(CPoint point) { CSampleDlg* configDlg = new CSampleDlg(NULL); INT_PTR bR

我有一个带有属性窗口的MFC应用程序。I属性窗口我已经实现了一个定制的CMFCPropertyGridProperty,这样每当用户单击添加到该属性中的按钮时,就会弹出另一个对话框

void CMFCPropertyGridCustomProperty::OnClickButton(CPoint point) {
    CSampleDlg* configDlg = new CSampleDlg(NULL);                            
    INT_PTR bResult = configDlg->DoModal();
    if(bResult != 1)        //If user cancels bResult is 2 ,if select ok bResult is 1
    {
        return;
    }
    CString selectedOutput   = configDlg->GetSelectionOutput();
    CString configValue = configDlg->GetSelectionElemValue();
但问题是,当我在调试模式下运行时,有时它工作正常,但有时在configDlg->GetSelectionOutput()行上崩溃。在callStack中,我发现变量当时超出了范围

以下是我的部分对话框代码:

IMPLEMENT_DYNAMIC(CSomeClassDlg, CDialogEx)

    CSomeClassDlg::CSomeClassDlg(CWnd* pParent /*=NULL*/)
        : CDialogEx(CSomeClassDlg::IDD, pParent)
    {
        m_DevNameStr    = "";
        m_ElemValue     = "";
    }

    CSomeClassDlg::~CSomeClassDlg()
    {

        delete m_DataXMLTree;
        m_DataXMLTree = NULL;

        delete m_TemplateXMLTree;
        m_TemplateXMLTree = NULL;

    }

    void CSomeClassDlg::OnItemchangedElementList(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
        int nPos = -1;



        nPos = m_ElementListCtrl.GetNextItem(-1,LVNI_SELECTED);
        if(nPos != -1)
        {
            elemDataNode = (CTreeNode*)(m_ElementListCtrl.GetItemData(nSelectedItemIndex));
            elemTepmplateNode = GetTemplateElement(elemDataNode);
            ShowElemDescription(elemDataNode,elemTepmplateNode);
        }
        else
        {
            return;
        }

        *pResult = 0;
    }


    void CSomeClassDlg::ShowElemDescription(CTreeNode* dataElemNode, CTreeNode* templateElemNode)
    {
        if(dataElemNode==NULL || templateElemNode==NULL)
        {
            m_DescEditCtrl.SetWindowTextA("");
            return;
        }

        CString PIXITStr        = templateElemNode->GetAttributeValue("AssociatedPixit");
        CString descriptionStr  = templateElemNode->GetAttributeValue("Description");
        CString valueStr        = dataElemNode->GetAttributeValue("Value");
        m_DescEditCtrl.SetWindowTextA(descriptionStr);
        m_DevNameStr    = PIXITStr;
        m_ElemValue     = valueStr;

    }

    CString CSomeClassDlg::GetSelectionOutput()
    {
        return m_DevNameStr;
    }
    CString CSomeClassDlg::GetSelectionElemValue()
    {
        return m_ElemValue;
    }
IMPLEMENT\u DYNAMIC(CSomeClassDlg、CDialogEx)
CSomeClassDlg::CSomeClassDlg(CWnd*pParent/*=NULL*/)
:CDialogEx(CSomeClassDlg::IDD,pParent)
{
m_DevNameStr=“”;
m_ElemValue=“”;
}
CSomeClassDlg::~CSomeClassDlg()
{
删除m_DataXMLTree;
m_DataXMLTree=NULL;
删除m_TemplateXMLTree;
m_TemplateXMLTree=NULL;
}
void CSomeClassDlg::OnItemchangedElementList(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMLISTVIEW pNMLV=重新解释铸件(pNMHDR);
int nPos=-1;
nPos=m_ElementListCtrl.GetNextItem(-1,已选择LVNI_);
如果(NPO!=-1)
{
elemDataNode=(CtreNode*)(m_ElementListCtrl.GetItemData(NselectEditedIndex));
ElemTemplateNode=GetTemplateElement(elemDataNode);
ShowElemDescription(elemDataNode、ElemTemplateNode);
}
其他的
{
回来
}
*预设值=0;
}
void CSomeClassDlg::ShowElemDescription(CTreeNode*dataElemNode,CTreeNode*templateElemNode)
{
if(dataElemNode==NULL | | templateElemNode==NULL)
{
m_DescEditCtrl.SetWindowTextA(“”);
回来
}
CString PIXITStr=templateElemNode->GetAttributeValue(“AssociatedPixit”);
CString descriptionStr=templateElemNode->GetAttributeValue(“Description”);
CString valueStr=dataElemNode->GetAttributeValue(“值”);
m_DescEditCtrl.SetWindowTextA(descriptionStr);
m_DevNameStr=PIXITStr;
m_ElemValue=valueStr;
}
CString CSomeClassDlg::GetSelectionOutput()
{
返回m_DevNameStr;
}
CString CSomeClassDlg::getSelectionElementValue()
{
返回m_ElemValue;
}

但我不明白这是否是问题所在,为什么每次都没有发生。如果问题真的存在,那么在执行doModal()之后,获取多成员变量的最佳wat是什么。请帮忙。

最后,我做了一些修改,解决了这个问题。 1.更改自定义CMFCPropertyGridProperty类的构造函数,特别是COleVariant类型的参数。 2.将对话框类构造函数更改为采用CtreNode*并将其存储为成员变量。不知何故,在DoModal之后,指针被损坏了。 3.在自定义CMFCPropertyGridProperty类的onclickbutton()中添加了一些Assert()以检查有效性,并添加了一个Redraw()。 我不知道所有这些变化的确切原因。在中找到引用代码

以下是自定义CMFCPropertyGridProperty类的onClick按钮:

    void CMFCPropertyGridPropertyCustomClass::OnClickButton(CPoint point)
    {   
        ASSERT_VALID(this);
        ASSERT_VALID(m_pWndList);
        ASSERT_VALID(m_pWndInPlace);
        ASSERT(::IsWindow(m_pWndInPlace->GetSafeHwnd()));

        m_bButtonIsDown = TRUE;
        Redraw();

        BOOL bUpdate        = FALSE;
        CString selOutput   = "";

        CSomeClassDlg* configDlg = new CSomeClassDlg(m_selNode);                            
        INT_PTR bResult = configDlg->DoModal();                            
        if(bResult == IDOK)
        {
            bUpdate     = TRUE;
            //Do Something
        }

        if (bUpdate)
        {
            if (m_pWndInPlace != NULL)
            {
                m_pWndInPlace->SetWindowText(selOutput);
            }

            m_varValue = (LPCTSTR) selOutput;
        }

        m_bButtonIsDown = FALSE;
        Redraw();

        if (m_pWndInPlace != NULL)
        {
            m_pWndInPlace->SetFocus();
        }
        else
        {
            m_pWndList->SetFocus();
        }

    }
     CMFCPropertyGridPropertyCustomClass::CMFCPropertyGridPropertyCustomClass(CTreeNode* pNode, const CString& strName, const CString& varValue, const CString& description) : CMFCPropertyGridProperty(strName, COleVariant((LPCTSTR)varValue), description)
    {
        //some initialization

    }
以下是自定义CMFCPropertyGridProperty类的构造函数:

    void CMFCPropertyGridPropertyCustomClass::OnClickButton(CPoint point)
    {   
        ASSERT_VALID(this);
        ASSERT_VALID(m_pWndList);
        ASSERT_VALID(m_pWndInPlace);
        ASSERT(::IsWindow(m_pWndInPlace->GetSafeHwnd()));

        m_bButtonIsDown = TRUE;
        Redraw();

        BOOL bUpdate        = FALSE;
        CString selOutput   = "";

        CSomeClassDlg* configDlg = new CSomeClassDlg(m_selNode);                            
        INT_PTR bResult = configDlg->DoModal();                            
        if(bResult == IDOK)
        {
            bUpdate     = TRUE;
            //Do Something
        }

        if (bUpdate)
        {
            if (m_pWndInPlace != NULL)
            {
                m_pWndInPlace->SetWindowText(selOutput);
            }

            m_varValue = (LPCTSTR) selOutput;
        }

        m_bButtonIsDown = FALSE;
        Redraw();

        if (m_pWndInPlace != NULL)
        {
            m_pWndInPlace->SetFocus();
        }
        else
        {
            m_pWndList->SetFocus();
        }

    }
     CMFCPropertyGridPropertyCustomClass::CMFCPropertyGridPropertyCustomClass(CTreeNode* pNode, const CString& strName, const CString& varValue, const CString& description) : CMFCPropertyGridProperty(strName, COleVariant((LPCTSTR)varValue), description)
    {
        //some initialization

    }

这样做应该没有问题,所以问题在于对话框的代码。“随机”问题通常表示未初始化的变量。@molbdnilo,在构造函数中,我已将其初始化为“”。还是解决不了。实际上,该变量存储listctrl中选择的字段,并生成字符串并将其存储为meber变量。我甚至在OnClickOK函数中设置了断点。该值仍然可以在那里访问。但在do模式完成后,会发生这种随机崩溃。我能告诉你如何捕捉到这一点以避免至少崩溃吗?即使你能捕捉到这种异常,但你不能,通过忽略它来解决bug也没有什么意义。您需要显示对话框代码。@molbdnilo,添加了对话框代码。请看一看,是否有任何可能,因为我使用的是对话框的父窗口为空是所有这一切的原因。我应该给父母打电话吗*