注册 登录
编程论坛 C++教室

MFC单文档分割窗口程序关闭时有中断问题

鸿蒙之灵 发布于 2021-01-04 11:07, 1516 次点击
平台:VS2013     用MFC创建了一个单文档工程,然后进行了分割窗口,现在的问题是,我在调试的时候一切正常,但是在点击程序界面上的关闭按钮进行关闭操作时,会触发中断,提示:有未经处理的异常,0xC000041D,我知道是释放资源出问题了,但是调用堆栈中无法定位到我自己的代码,全部是调用的库文件,希望哪位大神能够为我答疑,其关键代码如下:

程序代码:

//CMainFrame类继承CFrameWnd类
//MainFrm.h
public:
    CSplitterFrame *m_pSingFieldSplitterFrame;    //分割视图框架指针

 
//MainFrm.cpp

 
//OnCreateClient()函数中
    m_pSingFieldSplitterFrame = new CSplitterFrame;
    m_pSingFieldSplitterFrame->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW &~WS_BORDER,
        rcClient, this, 0, NULL, pContext);
    m_pSingFieldSplitterFrame->ShowWindow(SW_SHOW);
    m_pSingFieldSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    pContext->m_pNewViewClass = (CRuntimeClass*)m_pSingFieldSplitterFrame; //设置默认视图类

//CSplitterFrame类继承CFrameWnd类
BOOL CSplitterFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    // TODO: 在此添加专用代码和/或调用基类
    ScreenWidth = 1920;
    ScreenHigh = 980;//本站屏幕显示大小
    Row1Percent = 0.7;
    Row2Percent = 0.3;//站场和列车进路窗口的显示比例(合计为1)

    m_Splitter.CreateStatic(this,2,1);
    m_Splitter.CreateView(0, 0, RUNTIME_CLASS(CCTCCarTerminalView), CSize(ScreenWidth, ScreenHigh * Row1Percent), pContext); //0.7
    m_Splitter.CreateView(1, 0, RUNTIME_CLASS(CFUNListView), CSize(ScreenWidth, ScreenHigh * Row2Percent), pContext); //0.3
   
//CCTCCarTerminalView是工程创建的时候自动生成的视图类,继承CScrollView类
   
//CFUNListView是我分割出来的子类,继承CFormView类
   
    return true;
}
2 回复
#2
鸿蒙之灵2021-01-04 11:33
经试验:直接在CMainFrame::OnCreateClient()函数中进行分割窗口,关闭时是没有那个中断的,但是为什么用自己写的类,就会出现这个问题呢?

[此贴子已经被作者于2021-1-5 10:13编辑过]

#3
鸿蒙之灵2025-01-25 09:21
回复 2楼 鸿蒙之灵
回头来看,应该和MFC的框架、文档、视图三者的关系和限制有关,故自己创建的类中进行二次分割,在关闭软件时,类对象的销毁已经进行了析构,此时框架再销毁时就会访问到非法的指针,因此出现了中断,故为安全及简单好用计,更建议在框架上直接对界面的主体框架完成设计,而不是自己去重写,因为不好管理就会导致程序的熵值大幅增加。
1