读书人

100分求解决销毁new对象数组时非正常终

发布时间: 2012-03-02 14:40:29 作者: rapoo

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;
}

如果需要的话,可以改为指针数组,在构造函数删除,销毁的时候删除.......


[解决办法]

探讨
窗口类的析构函数里,所有指针delete后必须置NULL

[解决办法]
窗口释放顺序的问题吧
[解决办法]
当我把void CWindow::SetParent(CWindow* pParent)里面的pParent->AddWindow(this);注释掉之后程序正常退出。
[解决办法]
我的意思是说问题出在CBoxGroup里面。凌晨在看欧冠前调试了半天。虽然没能解决问题但是感觉像是指针是重复释放造成的。

读书人网 >C++

热点推荐