程序如下,其中在删除指针pData 时候有时会出现错误。请大家帮忙看看可能会出现错误的情况。开始怀疑有队列有相同指针。2次删除同一个指针,但已经判空了??
CTypedPtrArray<CObArray, CIMMessageData *> m_MessageArray;
try
{
while( m_MessageArray.GetSize() > 0 )
{
CIMMessageData* pData = m_MessageArray.GetAt(0);
m_MessageArray.RemoveAt( 0 );
if( pData != NULL )
{
delete pData;//有时会出现删除指针错误
pData = NULL;
} }
}
catch(...)
{
AfxMessageBox("Error");
}
CTypedPtrArray<CObArray, CIMMessageData *> m_MessageArray;
try
{
while( m_MessageArray.GetSize() > 0 )
{
CIMMessageData* pData = m_MessageArray.GetAt(0);
m_MessageArray.RemoveAt( 0 );
if( pData != NULL )
{
delete pData;//有时会出现删除指针错误
pData = NULL;
} }
}
catch(...)
{
AfxMessageBox("Error");
}
具体情况得调试程序才能知道。
============================================================================
提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
http://alphasun.betajin.com/ 遇到问题可以给我发消息,给我发信息时请附带原帖地址
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
m_MessageArray.RemoveAt( 0 );
GetAt(0), RemoveAt(0)取得对象后马上删除了对象,pData所指的对象已经删除了,pData指向一块无效的内存。所以会出错。
int nCount = m_MessageArray.GetSize();
for( int nIndex = 0; nIndex < nCount; nIndex++ )
{
CIMMessageData* pData = m_MessageArray.GetAt(nIndex);
if( pData != NULL )
{
delete pData;
pData = NULL;
}
}
m_MessageArray.RemoveAll();
to SeaSurf(风好扬帆):
这样做不行吗。相当于初始化啊。我试试你的办法。
to ruihuahan(飞不起来的笨鸟):
RemoveAt(0)只是将下一位移上来。这时pData所指的对象还存在。
CTypedPtrArray 有可能会帮你delete指针?但MSDN上没说过啊。我也没碰到这样的情况。
由于程序是很早以前开发的。现在改起来很棘手。谢谢大家了
m_MessageArray.RemoveAt( 0 );
if( pData != NULL )
{
delete pData;//有时会出现删除指针错误
pData = NULL;
}
其中有时删除错误可能是因为在m_MessageArray中函数GetAt(0)与下一条语句
m_MessageArray.RemoveAt( 0 );之间肯定关联有问题!
try
{
for (int i=0;i<m_MessageArray.GetSize-1;i++ )
{
CIMMessageData* pData = m_MessageArray.GetAt(0);
if( pData != NULL )
{
delete pData;//有时会出现删除指针错误
pData = NULL;
} }
}
catch(...)
{
AfxMessageBox("Error");
}
m_MessageArray.RemoveAll();//或者类似的某个函数
if( pData != NULL )
{
delete pData;//有时会出现删除指针错误
pData = NULL;//无效的操作:)
}
假设你在数组放了三个地址OX0001, 0X0002, OX0001,
你删除了第一个后, 变成0X0002, OX0001
并不是你想的0X0002, OX0000
你试着这样写代码看行不行:
int nCount = m_MessageArray.GetSize();
for( int nIndex = 0; nIndex < nCount; nIndex++ )
{
CIMMessageData* pData = m_MessageArray.GetAt(nIndex);
for( int i = nIndex + 1; i < nCount; i++ )
{
if( pData == m_MessageArray.GetAt(i))
m_MessageArray.SetAt(i, NULL);
} if( pData != NULL )
{
delete pData;
pData = NULL;
}
} m_MessageArray.RemoveAll();