【问题标题】:MFC "memory allocation violation"MFC“内存分配冲突”
【发布时间】:2016-03-25 06:18:11
【问题描述】:

我在对话框中创建了一个复选框,并尝试访问其条件(无论是否选中)。这是我的代码:

CButton *m_ctlCheckBlack = (CButton *)GetDlgItem(IDC_BLACK);

int chkBoxBlack = m_ctlCheckBlack->GetCheck();

当我运行这段代码时,它会弹出一个异常说:

Exception thrown at 0x0FA45564 (mfc140d.dll) in braille_obr.exe: 0xC0000005:      
Access violation reading location 0x00000020.

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您之前已经问过这个问题stackoverflow.com/q/36180788/4603670 --- 仅看两行代码很难说。人们可以猜测问题是什么,或者您可以花时间解释您在做什么。
  • 我想 m_ctlCheckBlackNULL 出于某种原因。
  • 您从哪里调用包含您发布的 2 行代码的函数?

标签: c++ visual-c++ mfc


【解决方案1】:

很少有充分的理由使用 GetDlgItem。在您的资源编辑器中,右键单击按钮并“添加变量..” 它将默认为控件。给它一个名字。您将在对话框类中获得一个成员:

CButton myButtonName;

现在应该可以安全了:

myButtonName.GetChecked( );

因为它已经被创建并被正确子类化了。

【讨论】:

    【解决方案2】:

    也许,我怀疑它在 Button 尚未构造时尝试获取按钮的状态。

    int chkBoxBlack = m_ctlCheckBlack != NULL ? m_ctlCheckBlack->GetCheck() : 0;
    

    或者,您是否尝试从外部对话框进行操作? 如果是这样,您最好尝试这样做。

    ■CButton *m_ctlCheckBlack = (CButton *)yourdlg.GetDlgItem(IDC_BLACK);
    
    ■FindWindowEx(yourdlg.GetSafeHwnd(), NULL, NULL, "(your button caption)");
    

    【讨论】:

    • 它返回一个 0,但我确实构建了按钮。可能的问题是什么?
    • 这段代码是用什么事件处理程序编写的?即使已经创建了 CButton 实例,作为 GUI 一部分的 Button Control 还不存在,是吗?
    • 我创建了一个 ID 为“IDC_BLACK”的复选框。 CButton 引用该复选框。我确实在 GUI 中创建了一个复选框。 @nariuji
    • 如果您在 OnCreate() 或 OnUpdate() 中编写此代码,则这些事件可能在按钮控件的创建操作之前运行。我认为有一些类似的事件。
    • 您是否尝试过使用 GetSafeHwnd() 并且只有在不为空时才运行 GetCheck 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2013-02-01
    • 2021-11-07
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多