100分求解决销毁new对象数组时非正常终止的问题。
折腾我好几天了,代码已经被删的只剩几个骨架了,核心代码只有短短10多行。就是文件有10几个..
代码见:
http://blog.csdn.net/xychzh/archive/2010/04/27/5532887.aspx
问题出在GUIManager::~GUIManager()里面
当执行此析构函数的时候,会销毁相关new出来的窗口对象。
然后销毁都某一个对象的时候,就会非正常终止。
问题主要来自:
- C/C++ code
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;}程序大致的结构图:
[图比较大,拖动一下,用浏览器查看]
【要求】
1:告诉我什么具体原因导致了这个问题的发生
2:尽量不改动我的这个写法,提出修正的方案。
ps:未可解难者,恳请不要随意回复
若有朋友可以帮忙解决此问题,在下感激不尽。
[解决办法]
能告诉我delete哪儿的时候崩溃的么?
[解决办法]
我回去看看!
[解决办法]
窗口类的析构函数里,所有指针delete后必须置NULL
[解决办法]
各个window子类的析构函数是正确的吗,析构函数是虚函数,确保delete *iter调用子类自己的析构函数。
[解决办法]
指针不置null就会乱指一气,也就成了野指针
[解决办法]
发现问题了 是指针悬空现象..
你销毁了 pWnd 但pWnd后面链接的所有pElement都悬空了
解决方案: 销毁pWnd时 先遍历pWnd下面链接的所有pElement 保证pElement都销毁了
再销毁 pWnd
最好是free(p); p=NULL; 组合使用
free前 测试若非NULL再free
[解决办法]
ps:未可解难者,恳请不要随意回复
这是让我说还是不让我说呢?算了还是说吧。
因为我才遇到了个差别多的问题。程序执行到退出时会发生异常。
窗口一用来管理一些资源的,比如关联到一个文件什么的。窗口销毁前是否将关联的资源关闭了。
[解决办法]
为啥你的CWindow子类的析构函数什么事情都没做呢?比如你的CBoxGroup的析构函数应该delete你的CCheckBoxCTL成员数组的指针。
[解决办法]
按照你的写法 其实 GUIManager 析构根本就没出去, 你释放的顺序是:
开始GUIManager
开始window
结束window
开始window
结束window
结束GUIManager
但是按照你现在的写法是
开始GUIManager
开始window
结束window
开始window
结束window
就到这里了
[解决办法]
你这样改试试:
- C/C++ code
// 删除所有窗口控件和所有窗口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;
}
如果需要的话,可以改为指针数组,在构造函数删除,销毁的时候删除.......
[解决办法]
[解决办法]
窗口释放顺序的问题吧
[解决办法]
当我把void CWindow::SetParent(CWindow* pParent)里面的pParent->AddWindow(this);注释掉之后程序正常退出。
[解决办法]
我的意思是说问题出在CBoxGroup里面。凌晨在看欧冠前调试了半天。虽然没能解决问题但是感觉像是指针是重复释放造成的。