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定义的是静态变量。请大牛指教!
12 个解决方案
#1
void CSocDataQueue::Append(CString &strBuffer)
{
CLockObj lockobj(&cs_dataQueue);
CSocDataQueue::m_listData.AddTail(strBuffer);
}
1. 为什么要引用, 把饮用去掉
2. 如果还有问题, 不是StringList的问题, 可能是你CLockObj的问题
{
CLockObj lockobj(&cs_dataQueue);
CSocDataQueue::m_listData.AddTail(strBuffer);
}
1. 为什么要引用, 把饮用去掉
2. 如果还有问题, 不是StringList的问题, 可能是你CLockObj的问题
#2
去掉引用和CLockObj还是不行啊,大家帮帮我啊
#3
把CStringList换成CStringArray
因为这个CStringList是添加对象的指针, 你如果 使用, 在Remove前, 必须delete。
#4
strBuffer.Empty();
strBuffer = CSocDataQueue::m_listData.RemoveHead();
return TRUE;
这边Remove时,要Delete
strBuffer = CSocDataQueue::m_listData.RemoveHead();
return TRUE;
这边Remove时,要Delete
#5
不知道你是怎么检查内存泄漏的。
你把串从list中removehead,但该串实际又转移到了strBuffer啊,所占内存并没有减少啊。退出程序时,你看到有内存泄漏提示了?
你把串从list中removehead,但该串实际又转移到了strBuffer啊,所占内存并没有减少啊。退出程序时,你看到有内存泄漏提示了?
#6
这些都是分配在stack上面的内存,系统会自动释放的。
#7
我是用winhex查看进程内存发现泄漏的,
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
#8
请问应该如何delete?
#9
你的代码本身并没有什么问题。不过:
1、如5楼所说,你需要再确认一下是否确实内存泄漏(仅仅根据你所说的那些,不足以认定泄漏),办法是:在VC里用Debug的方式运行,如果确实内存泄漏,那么当你的程序退出时,VC会告诉你的。
2、假若从这些代码里确实出现了内存泄漏,那么恐怕不是你的代码有什么问题,而是由于多线程造成的。CString内部算法的固有缺陷使它在多线程下是不安全的,有可能造成包括内存泄漏在内的各种错误。想要避开这一点,只有一个办法:不要在跨线程的数据中使用CString。
1、如5楼所说,你需要再确认一下是否确实内存泄漏(仅仅根据你所说的那些,不足以认定泄漏),办法是:在VC里用Debug的方式运行,如果确实内存泄漏,那么当你的程序退出时,VC会告诉你的。
2、假若从这些代码里确实出现了内存泄漏,那么恐怕不是你的代码有什么问题,而是由于多线程造成的。CString内部算法的固有缺陷使它在多线程下是不安全的,有可能造成包括内存泄漏在内的各种错误。想要避开这一点,只有一个办法:不要在跨线程的数据中使用CString。
#10
经过调试发现,当调用AddTail之后立即调用RemoveHead就没有问题,如果分开调用就会出现泄漏.奇怪了。。。
#11
谢谢您的指点。。。我先试一下,不用CString
#12
我是用winhex查看进程内存发现泄漏的,
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
----------------------------------
CString::GetBuffer(...)和CString::RleaseBuffer()对应
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
----------------------------------
CString::GetBuffer(...)和CString::RleaseBuffer()对应
#1
void CSocDataQueue::Append(CString &strBuffer)
{
CLockObj lockobj(&cs_dataQueue);
CSocDataQueue::m_listData.AddTail(strBuffer);
}
1. 为什么要引用, 把饮用去掉
2. 如果还有问题, 不是StringList的问题, 可能是你CLockObj的问题
{
CLockObj lockobj(&cs_dataQueue);
CSocDataQueue::m_listData.AddTail(strBuffer);
}
1. 为什么要引用, 把饮用去掉
2. 如果还有问题, 不是StringList的问题, 可能是你CLockObj的问题
#2
去掉引用和CLockObj还是不行啊,大家帮帮我啊
#3
把CStringList换成CStringArray
因为这个CStringList是添加对象的指针, 你如果 使用, 在Remove前, 必须delete。
#4
strBuffer.Empty();
strBuffer = CSocDataQueue::m_listData.RemoveHead();
return TRUE;
这边Remove时,要Delete
strBuffer = CSocDataQueue::m_listData.RemoveHead();
return TRUE;
这边Remove时,要Delete
#5
不知道你是怎么检查内存泄漏的。
你把串从list中removehead,但该串实际又转移到了strBuffer啊,所占内存并没有减少啊。退出程序时,你看到有内存泄漏提示了?
你把串从list中removehead,但该串实际又转移到了strBuffer啊,所占内存并没有减少啊。退出程序时,你看到有内存泄漏提示了?
#6
这些都是分配在stack上面的内存,系统会自动释放的。
#7
我是用winhex查看进程内存发现泄漏的,
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
#8
请问应该如何delete?
#9
你的代码本身并没有什么问题。不过:
1、如5楼所说,你需要再确认一下是否确实内存泄漏(仅仅根据你所说的那些,不足以认定泄漏),办法是:在VC里用Debug的方式运行,如果确实内存泄漏,那么当你的程序退出时,VC会告诉你的。
2、假若从这些代码里确实出现了内存泄漏,那么恐怕不是你的代码有什么问题,而是由于多线程造成的。CString内部算法的固有缺陷使它在多线程下是不安全的,有可能造成包括内存泄漏在内的各种错误。想要避开这一点,只有一个办法:不要在跨线程的数据中使用CString。
1、如5楼所说,你需要再确认一下是否确实内存泄漏(仅仅根据你所说的那些,不足以认定泄漏),办法是:在VC里用Debug的方式运行,如果确实内存泄漏,那么当你的程序退出时,VC会告诉你的。
2、假若从这些代码里确实出现了内存泄漏,那么恐怕不是你的代码有什么问题,而是由于多线程造成的。CString内部算法的固有缺陷使它在多线程下是不安全的,有可能造成包括内存泄漏在内的各种错误。想要避开这一点,只有一个办法:不要在跨线程的数据中使用CString。
#10
经过调试发现,当调用AddTail之后立即调用RemoveHead就没有问题,如果分开调用就会出现泄漏.奇怪了。。。
#11
谢谢您的指点。。。我先试一下,不用CString
#12
我是用winhex查看进程内存发现泄漏的,
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
----------------------------------
CString::GetBuffer(...)和CString::RleaseBuffer()对应
CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
AfxMessageBox(strBuffer);
strBuffer.ReleaseBuffer();
}
这样用应该没什么问题的吧?
----------------------------------
CString::GetBuffer(...)和CString::RleaseBuffer()对应