我建立一是一个基于Dlg的程序,运行时没有问题,只是在关闭程序时才会出
一个错误对话,(其中有什么重试,忽略,中止),而且程序运行过程中不点
Add 按钮,也不会出错
//////////dlg.h
protected:
CContactColletion m_Contacts; 
/////////dlg.cppOnBtnADD()

CContact m_pContact;
m_pContact.m_strName=m_strName;
m_pContact.m_strMember=m_strEdit;
m_Contacts.SetAt(m_pContact.m_strName,&m_pContact);
}
DestroyWindow()/在关闭程序时出错
{
POSITION pos;
CString strKey;
CContact *pContact;
pos=m_Contacts.GetStartPostion();
while(pos!=NULL)
{
m_Contacts.GetNextAssoc(pos,strKey,pContent);
if(pContact)
{
m_Contacts.RemoveKey(strKey);
delete pContact;
}
}
m_Contact.RemoveAll();
ASSERT(NULL==m_Contact.GetCount());
//contact.cpp
#progma once
class CContact
{
CString m_strName;
CString m_strMember;
.
.
.
}
typedef CTypePtrMap<CMapStringMap,CString,CContact*>CContactColletion;

解决方案 »

  1.   

    另外,我把m_pContact改成指针,按下ADD按钮就出错
    OnBtnADD()

    CContact *m_pContact;
    m_pContact->m_strName=m_strName;
    m_pContact->m_strMember=m_strEdit;
    m_Contacts.SetAt(m_pContact->m_strName,m_pContact);
    delete m_pContact;
    }
      

  2.   

    OnBtnADD()CContact *m_pContact=new CContact();建议你将CContact 从CObject继承
    来个空的构造函数和析构函数
      

  3.   

    关于CMap的使用,MSDN有例子,自己参详吧!主要是资源的释放方面,也就是DestroyWindow()中CMap的释放
      

  4.   

    //////////dlg.h
    protected:
    CContactColletion m_Contacts; 
    /////////dlg.cppOnBtnADD()

    CContact *m_pContact=new CContact;
    m_pContact->m_strName=m_strName;
    m_pContact_>m_strMember=m_strEdit;
    m_Contacts.SetAt(m_pContact->m_strName,m_pContact);
    //否则m_contacts将存无效地址----------||
    }
    DestroyWindow()/在关闭程序时出错
    {
    POSITION pos;
    CString strKey;
    CContact *pContact=NULL;
    pos=m_Contacts.GetStartPostion();
    while(pos!=NULL)
    {
    m_Contacts.GetNextAssoc(pos,strKey,pContent);
    if(pContact)
    {
    m_Contacts.RemoveKey(strKey);
    delete pContact;
    pContact=NULL
    }
    }
    m_Contact.RemoveAll();
    ASSERT(NULL==m_Contact.GetCount());
    //contact.cpp
    #progma once
    class CContact:public CObject
    {
    CContact(){};
    ~CContact(){};CString m_strName;
    CString m_strMember;
    .
    .
    .
    }
    typedef CTypePtrMap<CMapStringMap,CString,CContact*>CContactColletion;
      

  5.   

    但Debug窗口仍然把Collection中的内容显示出来,是不是说内存仍未释放
      

  6.   

    CContact *m_pContact;
    m_pContact->m_strName=m_strName;
    m_pContact->m_strMember=m_strEdit;
    m_Contacts.SetAt(m_pContact->m_strName,m_pContact);
    delete m_pContact;m_pContact你并没有分配内存(new等),用delete删除,当然会出错。OnDestroy()中也一样。
      

  7.   

    同意楼上 分配内存 然后加入到MAP
    析构的时候遍历整个MAP 将MAP的每个元素DELETE掉 就OK了