首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

在学习VC++深入详解,第13章第4节,串行化。遇到难题,求指教

2013-06-25 
正在学习VC++深入详解,第13章第4节,串行化。遇到难题,求指教在视类用pDoc-m_obarray和直接在文档类用m_oba

正在学习VC++深入详解,第13章第4节,串行化。遇到难题,求指教

在视类用pDoc->m_obarray和直接在文档类用m_obarray不是一样的吗,为什么中途会发生改变呢?
Class C**View
{
Public:
     Void  OnButtonUp (UINT nFlags, CPoint point)
     { 
          ………
          ………
          AAA aa(m_drawtype,m_ptori,point);       // AAA是一个自定义类,支持串行化
      C**Doc* pDoc = GetDocument();
      (pDoc->m_obArray).Add((CObject*)&aa);  //如图1,调试到此, (pDoc->m_obArray).的值是正确的      
          ………
     }
…………
Public:
     void  C**View::OnDraw(CDC* pDC)
  {
        C**Doc* pDoc = GetDocument();
      ……
      ……
  }
};


Class  C**Doc
{
………
………
………
public:
     CObArray m_obarray;
………
………
………
Public:
     void C**Doc::Serialize(CArchive& ar)
     {
          ………
          CObject *vv=m_obArray.GetAt(i);     //但是调试到这里时,m_obArray的成员就出错了  如图2
  ar<<vv;          
          ………
     }
};

图1
在学习VC++深入详解,第13章第4节,串行化。遇到难题,求指教
图2
在学习VC++深入详解,第13章第4节,串行化。遇到难题,求指教
mfc 序列化 文件 CObArray
[解决办法]
CObArray的成员存储的是CObject*这种通用对象指针类型,并没有存放对象自身。
也就是说,它存放的仅仅是指向对象的指针。
而你的对象aa在离开消息映射函数时已经自动释放掉了,自然指针指向的对象已经失效,序列化(串行化)也就没有意义了。

CObArray、CObList等集合类都存在这样的问题,也就是说,这种集合类的对象,成员都是CObject*这种通用对象指针类型,并不真正存储对象自身,因此要保证成员指向的对象不会随意释放,应该用new关键字创建这种对象,但不要忘了,删除某成员时,也要用delete关键字将成员指向的对象删除,否则删除成员会导致指向的对象失去引用,最终导致内存泄漏隐患。

热点排行