我的程序出现了问题,不是编译错误也不是运行时错误,debug下没有内存泄漏,但是release下发生了意想不到的行为,变量初始化方面没有错误。
现在唯一让我怀疑的地方就是:我用CObList保存了不同类型的对象,这些类都是一个类的子类。详细描述如下:CMesh         父类:网格
CMeshSphere   子类:球体网格
CMeshCylinder 子类:圆柱体网格
CMeshBox      子类:盒子网格
CMeshText     子类:文字网格CScene:场景类
场景类中用来保存网格的成员变量:CObList mMeshList;向场景中添加网格:
void CScene::add( CMesh* pMesh )
{
mMeshList.AddTail((CObject*)pMesh);
}清除场景中的网格:
void CScene::clearScene()
{
CMesh pMesh;
POSITION aPosition;
aPosition = mMeshList.GetHeadPosition();
while (aPosition)
{
pMesh = (Mesh*)mMeshList.GetNext(aPosition);
SAFE_DELETE(pMesh);
}
mMeshList.RemoveAll();
}现在的问题是:
在clearScene方法中我把mMeshList中的指针强制转换成父类的指针,这样是否安全?是否会有截断的危险?
如果这样不安全,我应该怎么处理这样的情况?
如果认为这样设计根本就是错误的,那应该如何是好?
我也尝试了用std::vector<CMesh*> mMeshList; 但是问题依旧,如果熟悉vector也可以用vector描述答案。
谢谢!

解决方案 »

  1.   

    补充:
    #define SAFE_DELETE(p) { if(p) { delete (p);     (p)=NULL; } }
      

  2.   

    再附一个问题:mMeshList在内存中是怎样分部的?
      

  3.   

    你存的是指针的话,对象本身的内存是你自己来分配和管理的
    mMeshList只给每个指针分配4个字节大的空间, 然后加前后指针
      

  4.   

    为了直观一点,我再进一步描述问题吧:这是一个多窗口的3D程序,窗口的内容是独立的,也就是说一个窗口对应一个场景对象,当其中一个窗口处于激活的状态下才动态添加网格模型到场景中,其他窗口则是非激活状态的,因为资源有限,非激活窗口场景中的网格模型都被释放( 调用clearScene()方法 )。现在的情况是,一个窗口A切换到另一个窗口B时,A窗口资源似乎是没有释放干净,一部分网格会叠加显示到B窗口中(比如A窗口中有5个球,B中有3个球,当切换到B时,B中原有的3个球显示,还会显示A中后面2个球),在程序逻辑上这是不可能的,窗口和场景对象是一一对应的,这里也没有全局的东西,因此我怀疑是内存读取方面的问题。
      

  5.   

    更让我觉得惊奇的是,如果我在B的激活事件里弹个消息框出来 (比如MessageBox("active");)居然就显示正常了!难道在 MessageBox的时候发生了什么?
    这个问题已经困扰我很长时间了,快要疯掉了!