CAssoc* pAssoc;
pAssoc = new CAssoc ;
我认为应该是没有分配的问题。

解决方案 »

  1.   

    这里的代码是MFC底层的用来实现窗口管理的程序,我的程序可一点都没有用到什么CMapPtrToPtr,也没用到CHandleMap,我只是用了GetParent()
      

  2.   

    不要把pAssoc != NULL 作为条件,指针除非你显式赋予空值,否则不会为NULL。
    问题是不是处在这个数租m_pHashTable,看看它是怎么来的,元素是否有效
      

  3.   

    呵呵!低级错误。
    for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
    不能使用pAssoc != NULL作为条件呀,应该使用pAssoc->pNext != NULL作为条件,因为循环中使用的是pAssoc->pNext呀!!!
      

  4.   

    我都说过了,这是MFC的源程序,他自有它的道理,大家还是看看别的地方吧
      

  5.   

    哦,刚才没有看清楚,呵呵,你是要自己写界面吗?CAppButton是个什么东西?是个自己写的按钮类?可能因为你用的哪个CButton是个临时的已经被系统给删掉了,hWnd存在,但是没有CButton和他关联,所以就不能使用CButton的GetParent()函数,建议你用API的 ::GetParent()
      

  6.   

    程序中是否使用了多线程? 凭感觉好象是在线程间传递了CWnd类.
      

  7.   

    to han012: 
         没有使用多线程
      

  8.   

    我改掉了,没用GetParent,直接将parent指针传过去,但是还是这样的错误
      

  9.   

    函数调用如下:
    CMapPtrToPtr::GetValueAt(void * 0x001e0a2e) line 188 + 3 bytes
    CHandleMap::LookupPermanent(void * 0x001e0a2e) line 90 + 22 bytes
    CWnd::FromHandlePermanent(HWND__ * 0x001e0a2e) line 303 + 12 bytes
    _AfxCbtFilterHook(int 3, unsigned int 1968686, long 1237800) line 530 + 9 bytes
    USER32! 77dfe832()
    USER32! 77dfbf45()
    NTDLL! 77f9f04b()
    USER32! 77dfbf75()
    CWnd::CreateEx(unsigned long 0, const char * 0x0051adac, const char * 0x004fd210 `string', unsigned long 1342177371, int 0, int 23, int 41, int 41, HWND__ * 0x00120858, HMENU__ * 0x00002710, void * 0x00000000) line 694 + 54 bytes
    CWnd::Create(const char * 0x0051adac, const char * 0x004fd210 `string', unsigned long 1342177371, const tagRECT & {top=23 bottom=64 left=0 right=41}, CWnd * 0x0012fda4 {CTLChoice hWnd=0x00120858}, unsigned int 10000, CCreateContext * 0x00000000) line 743
    CButton::Create(const char * 0x004fd210 `string', unsigned long 1342177371, const tagRECT & {top=23 bottom=64 left=0 right=41}, CWnd * 0x0012fda4 {CTLChoice hWnd=0x00120858}, unsigned int 10000) line 50
    CAppButton::CreateShort(const CRect & {top=23 bottom=64 left=0 right=41}, CWnd * 0x0012fda4 {CTLChoice hWnd=0x00120858}, CAppButton * 0x011f6ebc {CAppButton hWnd=0x001508cc}) line 582
      

  10.   

    把你的 CreateShort 函數貼出來.
      

  11.   

    问题在CreateShort(...)里面,程序中某个hWnd被破坏!
      

  12.   

    还是多粘些你的代码吧,这次没有用GteParent()函数都出错了,肯定是你的CAppButton::CreateShort函数有问题!!
      

  13.   

    // 该函数根据已有的一个CAppButton *pButton 创建新的CAppButton,然后我会delete旧的
    void CAppButton::CreateShort(const CRect& rc, CWnd* pWnd, CAppButton *pButton)
    {
    Create(_T(""),WS_CHILD|WS_VISIBLE|BS_ICON|WS_EX_ACCEPTFILES|BS_OWNERDRAW,
    rc,pWnd,m_nCtrlID++);             // m_nCtrlID 是静态成员变量,自动加一 m_pParent = (CTLChoice*)pWnd;    // CTLChoice是个CTabCtrl类
    m_sAppID.Format("%d",m_nCtrlID);

    CIniFile::EqualTo(&m_Ei,&(pButton->m_Ei)); SetValid(pButton->IsValid());
    if(HasDes())
    {
    m_pParent->AddTool(this,m_Ei.Des);
    }
    DragAcceptFiles();
    }
    //===========================================================
    顺便问一句,
    m_ppButton = new CAppButton* [m_nChoiceCount];
    for(INT nChoice=0; nChoice<m_nChoiceCount; nChoice++)
    m_ppButton[nChoice]=new CAppButton [nCount];
    这样创建一个二维的AppButton数组对吗?
    然后Delete 时
             for(INT nChoice=0; nChoice<m_nChoiceCount; nChoice++)
                       delete []m_ppButton[nChoice]
             delete []m_ppButton;
    上面的代码是否正确
      

  14.   

    我认为不对,起码不符合 二维数组的定义, m_ppButton[a][b] 能得到正确值吗? ( 我没测试过 )
      

  15.   

    可以得到正确值!!
    我有疑问的是delete有无问题
    ===============================================
    申明:!!!!!!!!!!!!!!1
    希望大家看看这个错误如何解决,后面的问题我是供参考的
      

  16.   

    对不起我不熟悉你说的着几个西东。
    我觉得delete []m_ppButton[nChoice];有问题,这样试试:for(INT nChoice=0; nChoice<m_nChoiceCount; nChoice++)
                      delete m_ppButton[nChoice];delete[] XXX就把整个数组清除了。