CMainFrame有三个Public性质不同种类的内存 UINT *pIndex;CString *pName;USHORT *pValue;
当在OnCreate时 使用InitDefaultConfig函数对这三块内存进行初始化 并赋值。OnCreate结束 程序正常运行后,任何时间退出这三块内存都可以正常释放。
程序有个设备类型初始化的问题,不同类型初始化的这三块内存长度有所不同 最小843 最大881.具体长度在OnCreate时初始化已经指定。如果用户选择另外一种类型后(比如长度由881变为843或者843变成881),上次初始的内存已经可以释放,本次内存也可以申请并初始化。只是当用户再次变更设备类型或者关闭程序需要释放第二次申请的内存时,程序就开始报错了。user breakpoint called at 0x777c04e4;
大家能不能帮忙分析一下原因啊?

解决方案 »

  1.   

    地址在代码中有没有改变?比如 pIndex++之类的操作,如果有的话,还要在改变之前用另一个指针*pTemp来指向当前指针,最后再delete []pTemp
      

  2.   

    在堆上分配就不会了,delete 之后记得置NULL
      

  3.   

    类型变化函数OnMoudle函数和OnCreate 对内存块初始化都用同一个函数:GetDefaultConfig()。这个函数有问题的话 估计OnCreate之后的关闭 很难正常结束。至于你说的++或者--更是没影的事,涉及该指针的操作都是下标法。而且我二次申请和二次释放时 我也跟踪了。地址完全正确。
      

  4.   

    堆和栈 我分的不太清 我这个是 new[]/delete[].你说的方式改如何申请?这边置NULL了。二次申请的时候 我也断点了 有地址。而且申请和初始化的时候 把信息也能打印出来。正常配置信息打印也没有问题。
      

  5.   

    看是否有越界操作,new了后如果越界操作,当时可能不会马上崩,但是delete的时候基本上会崩掉
      

  6.   

    “最小843 最大881”都是单数?DWORD对齐看看。
      

  7.   

    应该没有吧!在Ini文件里面配置成不同的设别类型时,只要不二次申请,都是可以初始化成功的,而且关闭也没有问题。如果是越界了,首次释放肯定先蹦。你说呢?
      

  8.   

    我这边解决了。问题是出在在CMainFrame里面 重新选择模块后返回当前的视图不正确造成的。原来pView=(CView *)this->GetActiveView();更改成CMainFrame *pFrame =CMainFrame *)AfxGetApp()->m_pMainWnd; CView *pView = (CView *)pFrame->GetActiveView();就可以了。原因在于CView里面也在使用上述三个内存区。原来的语句又新建了一个CView对象。