定义了一个
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定义的是静态变量。请大牛指教!

解决方案 »

  1.   

    void CSocDataQueue::Append(CString &strBuffer)
    {
      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
      

  5.   

    不知道你是怎么检查内存泄漏的。
    你把串从list中removehead,但该串实际又转移到了strBuffer啊,所占内存并没有减少啊。退出程序时,你看到有内存泄漏提示了?
      

  6.   

    这些都是分配在stack上面的内存,系统会自动释放的。
      

  7.   

    我是用winhex查看进程内存发现泄漏的,CString strBuffer = _T("");
    if (CSocDataQueue::GetHead(strBuffer))
    {
        AfxMessageBox(strBuffer);
        strBuffer.ReleaseBuffer();
    }这样用应该没什么问题的吧?
      

  8.   

    你的代码本身并没有什么问题。不过:
    1、如5楼所说,你需要再确认一下是否确实内存泄漏(仅仅根据你所说的那些,不足以认定泄漏),办法是:在VC里用Debug的方式运行,如果确实内存泄漏,那么当你的程序退出时,VC会告诉你的。
    2、假若从这些代码里确实出现了内存泄漏,那么恐怕不是你的代码有什么问题,而是由于多线程造成的。CString内部算法的固有缺陷使它在多线程下是不安全的,有可能造成包括内存泄漏在内的各种错误。想要避开这一点,只有一个办法:不要在跨线程的数据中使用CString。
      

  9.   

    经过调试发现,当调用AddTail之后立即调用RemoveHead就没有问题,如果分开调用就会出现泄漏.奇怪了
      

  10.   


    谢谢您的指点我先试一下,不用CString
      

  11.   

    我是用winhex查看进程内存发现泄漏的,CString strBuffer = _T("");
    if (CSocDataQueue::GetHead(strBuffer))
    {
      AfxMessageBox(strBuffer);
      strBuffer.ReleaseBuffer();
    }这样用应该没什么问题的吧?
    ----------------------------------
    CString::GetBuffer(...)和CString::RleaseBuffer()对应