我有一个在Linux系统上激活许多线程的系统。每个线程分配一定大小的缓冲区,当此缓冲区已满时,将其写入文件。每个线程都有自己的缓冲区,并将缓冲区写入不同的文件。我发现当我将缓冲区大小设置得相对较大(1M大小或更大)时,我开始遭受内存泄漏。但是当缓冲区很小 - 大约1K或更少 - 我没有这些内存泄漏。
任何人都知道它的原因是什么?更重要的是我如何克服这个问题?使用较小的缓冲区会严重影响系统的性能。
写入缓冲区 - 否则if(m_bUseBuffer) { //数据缓冲区现已满 if(m_nBufferSize + pi_nDataLength> = cMaxSizeQLoaderFileBuffer) { hRes = WriteDataToFile(); }
if (SUCCEEDED(hRes))
{
if (m_nBufferSize+pi_nDataLength <= cMaxSizeQLoaderFileBuffer)
{
memcpy(m_sBuffer+m_nBufferSize,pi_pData,pi_nDataLength);
m_nBufferSize += pi_nDataLength;
m_nBufferLinesCounter++;
//need to write buffer to file otherwise next time we write the file will be too large.
if (m_nBufferLinesCounter + m_nQLoaderFileLinesCounter >= m_nQLoaderFileMaxLines)
{
hRes = WriteDataToFile();
}
}
将缓冲区写入file-
hRes = OpenFile();
if (SUCCEEDED(hRes))
{
m_fQLoaderFile.write(m_sBuffer,m_nBufferSize);
m_fQLoaderFile.flush();
m_nBufferSize = 0;
m_nQLoaderFileLinesCounter += m_nBufferLinesCounter;
m_nBufferLinesCounter = 0;
}
何时来自type-std :: ofstream
答案 0 :(得分:0)
因为你的问题太模糊了,我只能给你一个通用答案:用valgrind
检查你的代码,它会报告所有内存泄漏。
顺便说一句,如果你的代码是正确的,那么缓冲区大小就无所谓了。
答案 1 :(得分:0)
是否可以将线程(或其缓冲区)包装在RAII包装器中?也就是说,堆栈分配的包装器对象具有重载的私有new运算符(以防止意外的堆分配),构造函数中发生的缓冲区堆分配以及析构函数中发生的解除分配?
或者:固定长度(堆栈分配)缓冲区是否适合您的问题?
答案 2 :(得分:0)
如果没有更多细节,几乎不可能回答这个问题。正如@karoly建议的那样,如果你的代码是正确的 - 缓冲区大小无关紧要。
当缓冲区大小很重要时,我可以想到的一点是,当缓冲区大小太大时,某些分配可能会失败。然后,当发生这种情况时,您可能会遇到在这种情况下不能很好地清理的代码(要么您没有捕获异常,要么不测试错误条件)。