CRRC_Shizhongnian 2024-08-15 11:11 采纳率: 0%
浏览 5

VC++打印内存泄漏(相关搜索:内存泄漏)

VC++编写打印程序,release正常,debug模式提示错误,错误内容为coreapp.cpp文件释放打印机信息:

// free printer info
    if (m_hDevMode != NULL)
        AfxGlobalFree(m_hDevMode);

我的程序代码如下:

//纸张及纵向、横向打印默认选择
    DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE;
    CPrintDialog dlg(FALSE);

    PRINTDLG   pd;
    pd.lStructSize = (DWORD)sizeof(PRINTDLG);
    BOOL   bRet = AfxGetApp()->GetPrinterDeviceDefaults(&pd);
    if (bRet)
    {
        //   protect   memory   handle   with   ::GlobalLock   and   ::GlobalUnlock  
        DEVMODE   FAR* pDevMode = (DEVMODE   FAR*)::GlobalLock(pd.hDevMode);
        if (pDevMode != NULL)
        {
            pDevMode->dmPaperSize = DMPAPER_A4;   //将打印纸设置为A4   
            //pDevMode->dmOrientation = DMORIENT_PORTRAIT;//纵向打印  
            pDevMode->dmOrientation = DMORIENT_LANDSCAPE;//横向打印   
        }
        dlg.m_pd.hDevMode = pd.hDevMode;
        ::GlobalUnlock(pd.hDevMode);
    }
            
    if (dlg.DoModal() == IDOK)
    {
        //得到打印机DC
        HDC hDC = dlg.GetPrinterDC();
        if (hDC == NULL)
        {
            return;
        }
        //经过HDC得到CDC指针
        CDC* pDC = CDC::FromHandle(hDC);
        pDC->m_bPrinting = TRUE;
        short cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
        short cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
        DOUBLE xPix = (DOUBLE)cxInch * 10 / 254;    //每 mm 宽度的像素
        DOUBLE yPix = (DOUBLE)cyInch * 10 / 254;    //每 mm 高度的像素
        
        //文档信息
        DOCINFO di;
        ::ZeroMemory(&di, sizeof(DOCINFO));
        di.cbSize = sizeof(DOCINFO);
        str=L" CAA操作报告";
        di.lpszDocName = str;

        //A4开始打印210mm*297mm
        int M, U;
        int nColPos[11] = {200,500,1600,3500,3800,4250,4700,5300,6000,6400,6800};
        
        CString strTitle[10] = {L"序号",L"工序",L"质检项目",L"标准",L"上限",L"下限",L"工具编号",L"操作时间",L"员工",L"结果"};
        CFont FontBt, FontZw, FontZw2;
        FontBt.CreateFont(180, 90, 0, 0, 400, FALSE, FALSE, 0,
            GB2312_CHARSET, OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
            DEFAULT_PITCH | FF_SWISS, L"宋体");
        CFont* pOldFont=NULL; 
        FontZw.CreateFont(110, 45, 0, 0, 300, FALSE, FALSE, 0,
            GB2312_CHARSET, OUT_STROKE_PRECIS,
            CLIP_STROKE_PRECIS, DRAFT_QUALITY,
            VARIABLE_PITCH | FF_SWISS, _T("宋体"));
        FontZw2.CreateFont(80, 30, 0, 0, 300, FALSE, FALSE, 0,
            GB2312_CHARSET, OUT_STROKE_PRECIS,
            CLIP_STROKE_PRECIS, DRAFT_QUALITY,
            VARIABLE_PITCH | FF_SWISS, _T("宋体"));
        
        BOOL bPrinting = (pDC->StartDoc(&di)>0);
        int nPage = 1;
        int nStep = 0;//0初始化 1正文
        int nRow = 1;
        CString WO_PROJECT, WO_TRAIN, WO_CAR, Mro_Code, INSPECTION_ITEMS, toolid, operationtime, staffID;
        int StandardValue;
        float CAAvalue;
        int nItem = 0;
        for(nItem=0; nItem<m_nTotalItem && bPrinting; nItem++)// 打印总行数m_nTotalItem 
        {
            if (nStep == 0)
            {
                //文件标头
                pDC->StartPage();
                nStep = 1;
                pOldFont=pDC->SelectObject(&FontBt);
                M = 1000;    //left margin
                U = 300;    //upper margin
                pDC->TextOutW(3000, 300, L"CAA操作记录");
                pDC->SelectObject(&FontZw);
                U += 300;
            }
                        //打印正文代码略

            //下一行
            nRow++;
            U += 150;
            if (nRow > nPage*24)
            {
                //超行
                str.Format(L"第%d页", nPage);
                pDC->TextOutW(3500, 4600, str);

                bPrinting = (pDC->EndPage() > 0);
                nStep = 0;
                nPage++;
            }
        }
        if (nRow % 24 > 0)
        {
            str.Format(L"第%d页", nPage);
            pDC->TextOutW(3500, 4600, str);
            }
        bPrinting = (pDC->EndPage() > 0);
        if (bPrinting)
        {
            pDC->EndDoc();
        }
        else
        {
            pDC->AbortDoc();
        }
        pDC->SelectObject(pOldFont);

        //结束打印
        pDC->EndDoc();
        //删除DC
        pDC->DeleteDC();

        if (dlg.m_pd.hDC) // 检查设备上下文句柄是否非空
        {
            DeleteDC(dlg.m_pd.hDC); // 释放设备上下文句柄
        }
        if (dlg.m_pd.hDevMode) // 检查DevMode句柄是否非空
        {
            ::GlobalFree(dlg.m_pd.hDevMode); // 释放DevMode句柄
            dlg.m_pd.hDevMode = NULL;
        }
        if (dlg.m_pd.hDevNames) // 检查DevNames句柄是否非空
        {
            ::GlobalFree(dlg.m_pd.hDevNames); // 释放DevNames句柄
        }
    }
    if (pd.hDevMode != NULL)
    {
        ::GlobalFree(pd.hDevMode);
        pd.hDevMode = NULL;
    }
    
    if (pd.hDevNames != NULL) 
    {
        ::GlobalFree(pd.hDevNames);
    }

搞不明白,我已经释放pd.hDevMode,而且pd.hDevMode=NULL,为什么在CWinApp::~CWinApp()中,m_hDevMode 并不为空。
尝试取消

```c++
`if (pd.hDevMode != NULL)
{::GlobalFree(pd.hDevMode);
pd.hDevMode = NULL;}
``,发现CWinApp::~CWinApp()中使用AfxGlobalFree(m_hDevMode);也出错。不知道什么原因,望专家指点!

  • 写回答

2条回答 默认 最新

  • 一直免费一直爽 2024-08-15 11:11
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的代码来看,你已经正确地释放了pd.hDevMode。但是,在CWinApp::~CWinApp()中出现内存泄漏的问题可能是因为你在其他地方没有正确地释放m_hDevMode

    为了解决这个问题,你需要确保在你的程序的整个生命周期中,所有分配给m_hDevMode的内存都被正确地释放。你可以在CWinApp::~CWinApp()中添加以下代码来释放m_hDevMode

    if (m_hDevMode != NULL)
    {
        AfxGlobalFree(m_hDevMode);
        m_hDevMode = NULL;
    }
    

    这样,你就可以确保在程序结束时,所有的内存都被正确地释放,从而避免内存泄漏。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月15日