CStringList为什么会有内存泄漏啊?

时间:2022-09-27 18:22:47
定义了一个
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的问题

#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


引用 4 楼 wade008 的回复:
strBuffer.Empty();
  strBuffer = CSocDataQueue::m_listData.RemoveHead();
  return TRUE;

这边Remove时,要Delete


请问应该如何delete?

#9


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

#10


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

#11


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


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

#12


我是用winhex查看进程内存发现泄漏的,

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的问题

#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


引用 4 楼 wade008 的回复:
strBuffer.Empty();
  strBuffer = CSocDataQueue::m_listData.RemoveHead();
  return TRUE;

这边Remove时,要Delete


请问应该如何delete?

#9


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

#10


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

#11


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


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

#12


我是用winhex查看进程内存发现泄漏的,

CString strBuffer = _T("");
if (CSocDataQueue::GetHead(strBuffer))
{
  AfxMessageBox(strBuffer);
  strBuffer.ReleaseBuffer();
}

这样用应该没什么问题的吧?
----------------------------------
CString::GetBuffer(...)和CString::RleaseBuffer()对应