定义了一个
CStringList CSocDataQueue::m_listData;添加到队列尾
void CSocDataQueue::Append(CString &strBuffer)
{
CLockObj lockobj(&cs_dataQueue); CSocDataQueue::m_listData.AddTail(strBuffer);
}// 从队列头取出数据
BOOL CSocDataQueue::GetHead(CString &strBuffer)
{
//CLockObj lock(&cs_dataQueue); if (CSocDataQueue::m_listData.IsEmpty())
return FALSE; strBuffer.Empty();
strBuffer = CSocDataQueue::m_listData.RemoveHead();
return TRUE;
}发现调用了Append函数之后内存长上去了,但是调用RemoveHead之后内存没有降下来,是怎么回事啊?为什么会有内存泄漏呢
另外,m_listData定义的是静态变量。请大牛指教!
CStringList CSocDataQueue::m_listData;添加到队列尾
void CSocDataQueue::Append(CString &strBuffer)
{
CLockObj lockobj(&cs_dataQueue); CSocDataQueue::m_listData.AddTail(strBuffer);
}// 从队列头取出数据
BOOL CSocDataQueue::GetHead(CString &strBuffer)
{
//CLockObj lock(&cs_dataQueue); if (CSocDataQueue::m_listData.IsEmpty())
return FALSE; strBuffer.Empty();
strBuffer = CSocDataQueue::m_listData.RemoveHead();
return TRUE;
}发现调用了Append函数之后内存长上去了,但是调用RemoveHead之后内存没有降下来,是怎么回事啊?为什么会有内存泄漏呢
另外,m_listData定义的是静态变量。请大牛指教!
解决方案 »
- 算法问题!!!
- 定义好一个类,在用它的成员函数时提示:error C2228: left of '.WriteErrLog' must have class/struct/un
- 完成端口 高手进
- _RecordsetPtr获得记录数出问题
- 最大化窗口,菜单失效问题
- 请问如何在新打开dialog时设置上面control的显示内容?
- 关于视图中打开Word的问题!!
- 高分急求解决方案:网络编程?????请看内容....
- 我在VC++版的第一个贴子(对于学习VC++的一点迷茫,请各位前辈指点,送100分)
- vs2010 右键MFC对话框为什么不能添加类?
- 高精度延时,延时几年也不卡。(有点小问题,麻烦高手帮忙修改下)
- 怎么把VC中的变量调入matlab画图?
{
CLockObj lockobj(&cs_dataQueue); CSocDataQueue::m_listData.AddTail(strBuffer);
}1. 为什么要引用, 把饮用去掉
2. 如果还有问题, 不是StringList的问题, 可能是你CLockObj的问题
把CStringList换成CStringArray因为这个CStringList是添加对象的指针, 你如果 使用, 在Remove前, 必须delete。
strBuffer = CSocDataQueue::m_listData.RemoveHead();
return TRUE;这边Remove时,要Delete
你把串从list中removehead,但该串实际又转移到了strBuffer啊,所占内存并没有减少啊。退出程序时,你看到有内存泄漏提示了?
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}这样用应该没什么问题的吧?
1、如5楼所说,你需要再确认一下是否确实内存泄漏(仅仅根据你所说的那些,不足以认定泄漏),办法是:在VC里用Debug的方式运行,如果确实内存泄漏,那么当你的程序退出时,VC会告诉你的。
2、假若从这些代码里确实出现了内存泄漏,那么恐怕不是你的代码有什么问题,而是由于多线程造成的。CString内部算法的固有缺陷使它在多线程下是不安全的,有可能造成包括内存泄漏在内的各种错误。想要避开这一点,只有一个办法:不要在跨线程的数据中使用CString。
谢谢您的指点我先试一下,不用CString
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}这样用应该没什么问题的吧?
----------------------------------
CString::GetBuffer(...)和CString::RleaseBuffer()对应