为什么delete指针会出现系统错误?下面的代码要频繁执行,所以我要删除指针分配的内存。代码如下:
COperation *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
ASSERT(ptOper);
ptOper->m_bGroup = m_blGroup;
ptOper->m_bExpected = m_blExpected; delete ptOper; // 出现系统错误。去掉这行后就没有问题,这是为什么?
COperation *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
ASSERT(ptOper);
ptOper->m_bGroup = m_blGroup;
ptOper->m_bExpected = m_blExpected; delete ptOper; // 出现系统错误。去掉这行后就没有问题,这是为什么?
解决方案 »
- STL list一个线程写,多个线程读能否不加读写锁
- 应用层通信协议讨论
- 有关SDI主菜单菜单项控制的问题
- 关于序列化的一个小问题:我如何序列化一个byte数组,这个数组很大,不会让我遍历吧
- 如何使程序最小化后什么界面都没有?
- xp中不能用 IP_HDRINCL 吗??如果是2000的朋友看看这个值是多少,不然VC老是说没定义。
- 请问如何在CListCtrl中让不同的item显示不同的颜色
- 请问如何得到其他联网机器的网络通断状态?
- 单文档多视,高分求教!
- CreateProcessAsUser打开IE,但打不开指定网页?
- *** 大家新年好啊! 祝大家发财啊! 问几个基本的COM技术问题!
- 关于http协议的文件上传(vc6.0)
加一句
m_pOpArray->RemoveAt(iCurSel);
不是你new的最好不要delete
你这个指针对象如果是需要在m_pOpArray中长期保存的,那么,就不要delete,当确定该指针对象不需要使用时再delete
如果是临时的,那么需要从m_pOpArray中删除该指针成员。否则自然会爆机,因为该指针指向的内容已经不知道是什么东东了,也就是常说的野指针了!
m_pOpArray是什么对象?它的具体实现是什么?
还有COperation的具体实现是什么?
COperation *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
上面这条语句究竟是不是分配内存呀?如果每次进入本函数不是都要重新分配内存的话,我干脆去掉 delete ptOper;
他们分别这么定义的。CObArrayM *m_pOpArray;class AFX_EXT_CLASS COperation : public CObject
{
DECLARE_SERIAL(COperation);
friend class CTestCase;
public:
BOOL UpdateIEofAllMsg(IEUpdateArea_T * pIEUpdateArea);
BOOL StaIEofAllMsg(IEUpdateArea_T * pIEUpdateArea);
void Serialize(CArchive &ar);
virtual void Edit();
virtual BOOL NeedYesNoText(CString& strPrompt);
const COperation& operator=(const COperation& op);
COperation();
virtual ~COperation();
BYTE m_nType;
BOOL m_bGroup;
BOOL m_bExpected;
不是分配内存,CObArray的实现是这样的:
CObject* CObArray::GetAt(int nIndex) const
{ ASSERT(nIndex >= 0 && nIndex < m_nSize);
return m_pData[nIndex]; }
因此不必在每次访问完该元素就delete ptOper,我们就像使用数组一样使用它,如果你要删除该位置的元素,
那么用m_pOpArray->RemoveAt(iCurSel);另如果m_pOpArray里放的是你new 出来的对象,在RemoveAt之后,还要再将对象删除。才不会有内存泄漏。
不需要delete
你new出来的要delete
不是你new的最好不要delete
补充一个吧。就算delete后最好也是再把指针赋值成0
ASSERT(ptOper);
ptOper->m_bGroup = m_blGroup;
ptOper->m_bExpected = m_blExpected; delete ptOper; // 出现系统错误。去掉这行后就没有问题,这是为什么?
~~~~~~~~~~~~~
COperation *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
从lz的代码上可以看到,m_pOpArray是COperation对象的数组(暂时这么说),
如果你放入的是通过new创建的对象,那么现在可以通过
delete ptOper;
删除这个对象,但是删除这个对象,并没有在m_pOpArray数组中删除
这个对象的索引.所以如果楼主要删除这个对象.
最好在加上
m_pOpArray->DeleteAt(iCurSel));
// DeleteAt是删除m_pOpArray中的第iCurSel个对象的索引.
// 楼主自己实现.
如果楼主添加对象是在栈上创建的
COperation pp;
COperation *p = pp;
m_pOpArray中如果放入的是p.那么那么delete ptOper肯定
会出现错误,这就是
用delete删除栈上对象的问题.
我猜想lz是上面的这种情况!
=====
COperation *ptOper = (COperation*)(m_pOpArray->GetAt(iCurSel));
ASSERT(ptOper);
ptOper->m_bGroup = m_blGroup;
ptOper->m_bExpected = m_blExpected;
和
m_pOpArray->GetAt(iCurSel)->m_bGroup = m_blGroup;
m_pOpArray->GetAt(iCurSel)->m_bExpected = m_blExpected;
等价.