我在我的程序中使用了CList,其中放了我的类:
class CMyClass
{
.....CList<CMyDataClass,CMyDataClass&>   m_MyDataList;
.....
}
这个链表中的东西是要存入数据库中的,因此,我在CMyClass中编写如下函数:
CMyClass::SaveToDatabase(....)
{
....
     int nCount = m_MyDataList.GetCount();
    POSITION pos = m_MyDataList.GetHeadPosition();
    for ( int i = 0; i < nCount; i++ )
   {  
         //数据存储操作 
    }
}在我的文档类中有一个CMyClass型的成员:
CMyClass    m_myclass;我在文档类的OnSaveDocument函数中存储数据:
m_myclass.SaveToDatabase(....)
这样用户就能在运行程序时,点击保存按钮来随时保存数据了。我的问题是这样的,当我按一次保存按钮,没问题,查看数据库,数据也确实保存了,我第二次按保存按钮,就会出现一个调试错误,错误信息如下:
....
File:dbgheap.c
Line:1017Expression:_BOLCK_TYPE_IS_VALID(pHead->nBlockUse)
.....我调试了一下,错误就在SaveToDatabase的循环中产生的,我不明白这个错误的意思,更搞不懂为什么第二次按保存按钮出错?另外,我在使用CList的过程中,发现这个东西实在是不好用,本想不用自己写个链表,省点事,没想到却给我带来了很多的不便,不知大家可常用MFC的模板类,请畅谈一下自己的看法

解决方案 »

  1.   

    to  yuliangpei(踏雪无痕) :
      我在网上搜了一下,搜到这点东西:
    http://www.china-askpro.com/msg45/qa72.shtml你去看看,好像还是没什么用啊
      

  2.   

    给两点意见:
    1。建议使用CObList而不是CList,因为CObList专门队列化对象
    2。你的CMyDataClass一定要定义IMPLEMENT_SERIAL 
    这样应该可以了
      

  3.   

    to fasthorse(快马):
    我是向数据库中存数据啊,不用序列化的啊
      

  4.   

    to  joachern(程序人生) :
        深有同感,以后我都自己写链表了,唉,天下没有免费的午餐啊!
      

  5.   

    你能说一下,错误出现在for循环的哪个地方吗?我想看一下,我的问题解决了,由于弱智造成的。呵呵!
      

  6.   

    to yuliangpei(踏雪无痕) : for ( int i = 0; i < nCount; i++ )
     {  
             CMyDataClass& data = m_MyDataList.GetNext( pos );//我注掉除了这句外的所有语句,发现进行循环后,执行完这句就出错
      }
      

  7.   

    当执行错误的时候pos的值是否非空啊?你跟一下试试,看他是不是空的。
      

  8.   

    循环应这样:
      CMyDataClass* pMyDataClass;
      POSITION pos=m_MyDataList.GetNext(pos);
      while(pos!=NULL)
      {
        pMyDataClass=(CMyDataClass*)m_MyDataList.GetNext(pos);
        ....
       }
    我觉的CList类挺好使的
      

  9.   

    to lgflgflgf(卢桂馥) :
    我的代码是这样写的:
    CMyClass::SaveToDatabase(....)
    {
    ....
         int nCount = m_MyDataList.GetCount();
        POSITION pos = m_MyDataList.GetHeadPosition();
        for ( int i = 0; i < nCount; i++ )
       {  
             //数据存储操作 
        }
    }
    其中存储的是对象,而不是指针
      

  10.   

    to  yuliangpei(踏雪无痕) :
    我在调试器中观察了一下,pos不为空,晕
      

  11.   

    我今天另外写了一个小的测试程序,程序代码如下:
    class CMyTest
    {
    public:
    CString string1 ;
    CString string2 ;
    };
    CMyTest *pTest ;
    CList <CMyTest *, CMyTest *> mList ;//添加数据到链表
    for( int i = 0; i < 10; i++ )
    {
    pTest = new CMyTest ;
    pTest->string1.Format( "%d", i ) ;
    pTest->string2.Format("0%d", i ) ;
    mList.AddHead( pTest ) ;
    }//显示
    CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST1) ;
    POSITION pos = mList.GetHeadPosition() ;
    while( pos )
    {
    pListBox->AddString( mList.GetAt(pos)->string1) ;
    mList.GetNext(pos) ;
    }
    没有问题的,最后再释放
      

  12.   

    我的问题解决了,我原先把函数定义成const 的:
    CMyClass::SaveToDatabase(....) const
    {
    ....
         int nCount = m_MyDataList.GetCount();
        POSITION pos = m_MyDataList.GetHeadPosition();
        for ( int i = 0; i < nCount; i++ )
       {  
             //数据存储操作 
        }
    }我把const去掉就行了,问题是解决了,可我不清楚是什么原因,请哪位给个说法吧,谢了