100分求解决销毁new对象数组时非正常终止的问题。
折腾我好几天了,代码已经被删的只剩几个骨架了,核心代码只有短短10多行。就是文件有10几个..
代码见:
http://blog.csdn.net/xychzh/archive/2010/04/27/5532887.aspx
问题出在GUIManager::~GUIManager()里面
当执行此析构函数的时候,会销毁相关new出来的窗口对象。
然后销毁都某一个对象的时候,就会非正常终止。
问题主要来自:
bool CBoxGroup::LoadFromIni(){ m_BoxNum = 3; m_pCheckBoxCTL = new CCheckBoxCTL[m_BoxNum]; CWindow* pWnd = NULL; for (int i=0; i<m_BoxNum; i++) { pWnd = &m_pCheckBoxCTL[i]; pWnd->SetParent(m_pParent); cout << " ·子窗口加入该父窗口链表\n" << endl; } return true;}// 删除所有窗口控件和所有窗口ID信息void GUIManager::RemoveAll(){ cout << "--GUIManager进来了-\n" << endl; WndIter iter = m_WindowsList.begin(); cout << "m_WindowsList.size()-----begin:" << m_WindowsList.size() << endl; while(iter != m_WindowsList.end()) { m_WindowsList.erase(iter++); } cout << "m_WindowsList.size()-----erase:" << m_WindowsList.size() << endl; m_WindowsList.clear(); m_pMainWindow = NULL; cout << "--GUIManager出去了************-\n" << endl;}
[解决办法]
结果是clear之前的 应该是正常的
[解决办法]
你第二个createcontrol 要依赖第一个createcontrol返回值的指针,
如果释放内存,处理不好会造成链式释放。这样就会出错。
用boost::shared_ptr可以解决这些问题。
[解决办法]
在你的CBoxGroup里面分配的checkbox的时候是分的控件数组,但是在删除的时候确是单个删除的,可能有问题吧.......................
[解决办法]
既然要分开加入到parent里面,应该循环生成多个比较好...........
[解决办法]
如果不需要的话,可以去掉CCheckBoxCTL
bool CBoxGroup::LoadFromIni()
{
m_BoxNum = 3;
CWindow* pWnd = NULL;
for (int i=0; i<m_BoxNum; i++)
{
pWnd = CCheckBoxCTL;
pWnd->SetParent(m_pParent);
cout << " ·子窗口加入该父窗口链表\n" << endl;
}
return true;
}
如果需要的话,可以改为指针数组,在构造函数删除,销毁的时候删除.......
[解决办法]