用MFC 开发好了一个软件,删除了界面上一些没用的控件。
结果出现问题了,每次关闭程序的时候,debug错误  array_s.cpp 出错
跟踪发现关闭程序是在析构一个地址为XXXXXXXeb8的CStringArray对象时出现错误。
可是我在array_s.cpp中CStringArray的构造函数出也设置了断点,没发现程序构造过地址为XXXXXXXeb8的CStringArray对象。
该怎么解决,谢谢大家。

解决方案 »

  1.   

    检查你自己的所有的CStringArray相关的变量,以及查看call stack,出错的过程
      

  2.   

    检查变量是否析构了多次,delete之后没有 赋NULL 之类的;
      

  3.   

    >>删除了界面上一些没用的控件如果在删除之前是正常的,那么可以检查一下和这些控件相关的一些操作
    比如是否有数据的读写等等
      

  4.   

    // QYMISDlg.h : header file
    //
    //{{AFX_INCLUDES()
    #include "adodc.h"
    #include "datagrid.h"
    #include "datalist.h"
    //}}AFX_INCLUDES#if !defined(AFX_QYMISDLG_H__D736B9A9_2DB8_415A_8FD8_DA772B95FF19__INCLUDED_)
    #define AFX_QYMISDLG_H__D736B9A9_2DB8_415A_8FD8_DA772B95FF19__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////
    // CQYMISDlg dialogclass CQYMISDlg : public CDialog
    {
    // Construction
    public:
    CString StuId;
    CString DepId;
    CString ClsId;
    CString CoachId;
    //IStdDataFormatDispPtr   spIStdDataFormatDisp; 
    CQYMISDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
    //{{AFX_DATA(CQYMISDlg)
    enum { IDD = IDD_QYMIS_DIALOG };
    CTreeCtrl m_Tree;
    CString m_StuName;
    CString m_Sex;
    CString m_Birth;
    CString m_Mobile;
    CString m_Phone;
    CString m_ClassTime;
    CString m_School;
    CString m_Item;
    CString m_DepName;
    CString m_State;
    CString m_ClsName;
    CString m_CoachName;
    CString m_RoomAddr;
    CAdodc m_Adodc;
    CDataGrid m_Datagrid;
    CDataGrid m_Datagrid2;
    CAdodc m_Adodc3;
    CString m_QueryStr;
    //}}AFX_DATA // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CQYMISDlg)
    public:
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    HICON m_hIcon; // Generated message map functions
    //{{AFX_MSG(CQYMISDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnSelChangeDatagrid1(short FAR* Cancel);
    afx_msg void OnStuAddNew();
    afx_msg void OnStuUpdateInfo();
    afx_msg void OnStuNotPayed();
    afx_msg void OnStuClsMan();
    afx_msg void OnStuPayMan();
    afx_msg void OnBtnRecCheckin();
    afx_msg void OnClsCheckinMan();
    afx_msg void OnBtnQuery();
    afx_msg void OnStuCheckin();
    afx_msg void OnEmpMan();
    afx_msg void OnRowColChangeDatagrid(VARIANT FAR* LastRow, short LastCol);
    afx_msg void OnClsMan();
    DECLARE_EVENTSINK_MAP()
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    private:
    void Refresh_Tree();
    void InitTdyCls();
    int iState;
    void Refresh_StuInfo();
    void Refresh_StuList();
    CStringArray a_DepId;
    CStringArray a_DepName;
    CStringArray a_UpperId;
    HTREEITEM m_root;
    CImageList m_treeImageList;
    void Load_Dep();
    void AddtoTree(HTREEITEM m_node, int UpperId);
    };//{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_QYMISDLG_H__D736B9A9_2DB8_415A_8FD8_DA772B95FF19__INCLUDED_)
      

  5.   

    最后发现是删除一个Datagrid控件才发生这样的调试错误
    可是只要在头文件中加一个 CDataGrid m_Datagrid4定义,程序就不会出现问题,把这个变量声明注释掉又会出现问题。
    我查找了一下,发现程序中没有任何地方用到m_Datagrid4啊。疑惑,难道配注释掉这个变量声明就会出现堆栈益处吗?
      

  6.   

    最后发现只要在那一行的位置定义一个CDataGrid变量就不会出现错误。
      

  7.   


    非常感谢,clean后,重新build就ok了。