读书人

在学习VC++深入详解第13章第4节串

发布时间: 2013-06-25 23:45:41 作者: rapoo

正在学习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关键字将成员指向的对象删除,否则删除成员会导致指向的对象失去引用,最终导致内存泄漏隐患。

读书人网 >C++

热点推荐