这个new出来内存该释放?

DailyJob 2008-09-04 05:55:02
struct USER_INFO_EX;
typedef struct USER_INFO_EX
{
char szName[20];
char szSex[5];
int nAge;
USER_INFO_EX *pNext;
}*PUSER_INFO_EX;

BOOL CWDatabase::GetUserInfo( PUSER_INFO_EX *pUserInfo)
{
try
{
CString strSql;
strSql.Format(_T("select *from UserTab") );
m_spRecordset.CreateInstance( __uuidof( Recordset ) );

m_spRecordset->Open( _bstr_t(strSql), m_spConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );

_variant_t varFieldValue;

PUSER_INFO_EX pHead = NULL;
PUSER_INFO_EX pTail = NULL;
PUSER_INFO_EX pNew = NULL;

while( !m_spRecordset->adoEOF )
{
pNew = new USER_INFO_EX;
varFieldValue = m_spRecordset->GetCollect("NAME_USER");
if( varFieldValue.vt != VT_NULL )
_tcscpy(pNew->szName, (const char*)_bstr_t(varFieldValue));

varFieldValue = m_spRecordset->GetCollect("SEX");
if( varFieldValue.vt != VT_NULL )
_tcscpy(pNew->szSex, (const char*)_bstr_t(varFieldValue));

varFieldValue = m_spRecordset->GetCollect("AGE");
if( varFieldValue.vt != VT_NULL )
pNew->nAge = (long)varFieldValue;

if( NULL == pHead )
{
pHead = pTail = pNew;
}else
{
pTail->pNext = pNew;
pTail = pNew;
pNew->pNext = NULL;

}
m_spRecordset->MoveNext();

}
*pUserInfo = pHead;

/* 在这释放读取的时候崩溃了
if( pNew != NULL ){
delete pNew;
pNew = NULL; }*/

return TRUE;
}catch( _com_error e )
{
AfxMessageBox(e.Description());
return FALSE;
}

}

调用的时候是这样的///////////////////////////////////////////////
BOOL CPageManageOffUser::LoadUserInfoToDB()
{
PUSER_INFO_EX pUserInfo = NULL;
if( g_pDB->GetUserInfo( &pUserInfo ) )
{
PUSER_INFO_EX pTemp = pUserInfo;
CString strNum;
while(pTemp)
{
strNum.Format("%d", m_iIndex + 1 );
m_UserList.InsertItem(m_iIndex, strNum, 0);
m_UserList.SetItem(m_iIndex, 1, LVIF_TEXT, pTemp->szName,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 2, LVIF_TEXT, pTemp->szSex,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 3, LVIF_TEXT, pTemp->nAge,0,0,0,NULL );
m_iIndex ++;
pTemp = pTemp->pNext;
}
}
return TRUE;
}

释放pNew 在读取的时候崩溃了..
还是在我获取数据时链表的问题???
可用分全部献上.. 明天一早结账. 谢谢大家了
...全文
166 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-09-05
  • 打赏
  • 举报
回复
if( NULL == pHead )
{
pHead = pTail = pNew;
}else {
pTail->pNext = pNew;
pTail = pNew;
pNew->pNext = NULL;
}
这段代码把new分配的指针添加到了链表里面。

LoadUserInfoToDB中的循环是遍历这个链表,显示数据,在这里顺便释放内存,只要链表没有其它代码被破坏,delete就可以释放链表中的所有内存。
fangsp 2008-09-05
  • 打赏
  • 举报
回复
帮忙顶一下
cwc270 2008-09-05
  • 打赏
  • 举报
回复
struct USER_INFO_EX;
typedef struct USER_INFO_EX
{
char szName[20];
char szSex[5];
int nAge;
USER_INFO_EX *pNext;
}*PUSER_INFO_EX;

BOOL CWDatabase::GetUserInfo( PUSER_INFO_EX *&pUserInfo) //这里改一下
{
try
{
CString strSql;
strSql.Format(_T("select *from UserTab") );
m_spRecordset.CreateInstance( __uuidof( Recordset ) );

m_spRecordset->Open( _bstr_t(strSql), m_spConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );

_variant_t varFieldValue;

PUSER_INFO_EX pHead = NULL;
PUSER_INFO_EX pTail = NULL;
PUSER_INFO_EX pNew = NULL;

while( !m_spRecordset->adoEOF )
{
pNew = new USER_INFO_EX;
varFieldValue = m_spRecordset->GetCollect("NAME_USER");
if( varFieldValue.vt != VT_NULL )
_tcscpy(pNew->szName, (const char*)_bstr_t(varFieldValue));

varFieldValue = m_spRecordset->GetCollect("SEX");
if( varFieldValue.vt != VT_NULL )
_tcscpy(pNew->szSex, (const char*)_bstr_t(varFieldValue));

varFieldValue = m_spRecordset->GetCollect("AGE");
if( varFieldValue.vt != VT_NULL )
pNew->nAge = (long)varFieldValue;

if( NULL == pHead )
{
pHead = pTail = pNew;
pNew->pNext = NULL; //加上这个,防止只有一条记录时出现问题
}
else
{
pTail->pNext = pNew;
pTail = pNew;
pNew->pNext = NULL;

}
m_spRecordset->MoveNext();

}
//*pUserInfo = pHead;
pUserInfo = pHead; //改成这样

/* 在这释放读取的时候崩溃了 //这里不需要释放
if( pNew != NULL ){
delete pNew;
pNew = NULL; }*/

return TRUE;
}catch( _com_error e )
{
AfxMessageBox(e.Description());
return FALSE;
}

}

调用的时候是这样的///////////////////////////////////////////////
BOOL CPageManageOffUser::LoadUserInfoToDB()
{
PUSER_INFO_EX pUserInfo = NULL;
if( g_pDB->GetUserInfo( &pUserInfo ) )
{
PUSER_INFO_EX pTemp = pUserInfo;
CString strNum;
while(pTemp)
{
strNum.Format("%d", m_iIndex + 1 );
m_UserList.InsertItem(m_iIndex, strNum, 0);
m_UserList.SetItem(m_iIndex, 1, LVIF_TEXT, pTemp->szName,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 2, LVIF_TEXT, pTemp->szSex,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 3, LVIF_TEXT, pTemp->nAge,0,0,0,NULL );
m_iIndex ++;
pTemp = pTemp->pNext;
}
}
while(pUserInfo != NULL)//这里释放
{
PUSER_INFO_EX pTemp = pUserInfo;
pUserInfo = pUserInfo->pNext;

delete pTemp;
}
return TRUE;
}
scq2099yt 2008-09-05
  • 打赏
  • 举报
回复
释放的时候还有别的地方在用它吗?
DailyJob 2008-09-05
  • 打赏
  • 举报
回复
有人吗? waiting...
DailyJob 2008-09-05
  • 打赏
  • 举报
回复
谢谢大家~~
我还有个疑问.


while( !m_spRecordset->adoEOF )
{
pNew = new USER_INFO_EX;//如果有1000条记录的话这里就new了1000个USER_INFO_EX
//而pNew只保存了最后一个new的空间地址,释放的时候是否只
//释放了最后一个new的空间?


varFieldValue = m_spRecordset->GetCollect("NAME_USER");
if( varFieldValue.vt != VT_NULL )
_tcscpy(pNew->szName, (const char*)_bstr_t(varFieldValue));

varFieldValue = m_spRecordset->GetCollect("SEX");
if( varFieldValue.vt != VT_NULL )
_tcscpy(pNew->szSex, (const char*)_bstr_t(varFieldValue));

varFieldValue = m_spRecordset->GetCollect("AGE");
if( varFieldValue.vt != VT_NULL )
pNew->nAge = (long)varFieldValue;

if( NULL == pHead )
{
pHead = pTail = pNew;
}else {
pTail->pNext = pNew;
pTail = pNew;
pNew->pNext = NULL;
}

m_spRecordset->MoveNext();
}
*pUserInfo = pHead;

/* 在这释放读取的时候崩溃了
if( pNew != NULL ){
delete pNew;
pNew = NULL; }*/

return TRUE;
}catch( _com_error e )
{
AfxMessageBox(e.Description());
return FALSE;
}



调用的时候是这样的///////////////////////////////////////////////

BOOL CPageManageOffUser::LoadUserInfoToDB()
{
PUSER_INFO_EX pUserInfo = NULL;
if( g_pDB->GetUserInfo( &pUserInfo ) )
{
PUSER_INFO_EX pTemp = pUserInfo;
CString strNum;
while(pTemp)
{
strNum.Format("%d", m_iIndex + 1 );
m_UserList.InsertItem(m_iIndex, strNum, 0);
m_UserList.SetItem(m_iIndex, 1, LVIF_TEXT, pTemp->szName,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 2, LVIF_TEXT, pTemp->szSex,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 3, LVIF_TEXT, pTemp->nAge,0,0,0,NULL );
m_iIndex ++;
//这里改成如1楼cnzdgs兄的代码,是否已释放所有分配的内存, 我如何知道已释放成功呢?
PUSER_INFO_EX pTemp2 = pTemp;
pTemp = pTemp->pNext;
delete pTemp2;
}

}
return TRUE;
}


谢谢大家, 在线等, 马上结账
DailyJob 2008-09-05
  • 打赏
  • 举报
回复
多谢大家的指点, .. 我会慢慢研究..多谢了
captain_x 2008-09-04
  • 打赏
  • 举报
回复
if( g_pDB->GetUserInfo( &pUserInfo ) )
{
PUSER_INFO_EX pTemp = pUserInfo;
CString strNum;
while(pTemp)
{
strNum.Format("%d", m_iIndex + 1 );
m_UserList.InsertItem(m_iIndex, strNum, 0);
m_UserList.SetItem(m_iIndex, 1, LVIF_TEXT, pTemp->szName,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 2, LVIF_TEXT, pTemp->szSex,0,0,0,NULL );
m_UserList.SetItem(m_iIndex, 3, LVIF_TEXT, pTemp->nAge,0,0,0,NULL );
m_iIndex ++;
pTemp = pTemp->pNext;
}
}
这里面你又用了你已经释放的内存,当然会崩溃了。
你应该在while循环后再把pUserInfo里的所有内存再释放了。
schlafenhamster 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
在LoadUserInfoToDB函数中,将pTemp = pTemp->pNext改为下列代码:
PUSER_INFO_EX pTemp2 = pTemp;
pTemp = pTemp->pNext;
delete pTemp2;
另外catch块中也用类似方法释放。
[/Quote]
suilj 2008-09-04
  • 打赏
  • 举报
回复
在整个链表都用完了再释放,还要注意顺序
Nosky100 2008-09-04
  • 打赏
  • 举报
回复
你这个不是造链表么?为什么在那个时候释放啊?
xiaolonghong 2008-09-04
  • 打赏
  • 举报
回复
你这段代码,逻辑上有不妥的地方,PUSER_INFO_EX pNew = NULL应放在while循环里面,NEW的时候才能管理,删除统一在while外。
oo_v_oo 2008-09-04
  • 打赏
  • 举报
回复
申请的动态内存应该在使用完以后再释放空间,就像LS的更改,将内存释放工作放在调用函数,数据插入列表控件之后。
cnzdgs 2008-09-04
  • 打赏
  • 举报
回复
在LoadUserInfoToDB函数中,将pTemp = pTemp->pNext改为下列代码:
PUSER_INFO_EX pTemp2 = pTemp;
pTemp = pTemp->pNext;
delete pTemp2;
另外catch块中也用类似方法释放。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧