0

我有一个系统,其中有许多线程正在 Linux 系统上被激活。每个线程分配一个特定大小的缓冲区,当该缓冲区已满时将其写入文件。每个线程都有自己的缓冲区并将缓冲区写入不同的文件。我发现当我将缓冲区大小设置为相对较大(1M 大小或更大)时,我开始遭受内存泄漏的困扰。然而,当缓冲区很小时——大约 1K 或更少——我没有这些内存泄漏。

任何人都知道它的原因是什么?更重要的是我该如何克服这个问题?使用较小的缓冲区会极大地影响我的系统性能。

写入缓冲区 - else 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();
                }
            }

将缓冲区写入文件-

            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

4

3 回答 3

0

如果没有更多细节,几乎不可能回答这个问题。正如@karoly 建议的那样,如果您的代码正确 - 缓冲区大小无关紧要。

当缓冲区大小很重要时,我能想到的一件事是,当缓冲区大小太大时,某些分配可能会失败。然后,当这种情况发生时,可能您的代码在这种情况下不能很好地清理(您没有捕获异常,或者没有测试错误条件)。

于 2012-10-22T09:57:41.993 回答
0

因为你的问题太模糊,我只能给你一个笼统的答案:用 来检查你的代码valgrind,它会报告所有的内存泄漏。

顺便说一句,如果您的代码正确,则缓冲区大小无关紧要。

于 2012-10-22T09:46:40.333 回答
0

是否可以将线程(或其缓冲区)包装在RAII包装器中?也就是说,堆栈分配的包装对象具有重载的私有 new 运算符(以防止意外的堆分配),缓冲区的堆分配发生在构造函数中,而取消分配发生在析构函数中?

或者:固定长度(分配堆栈)缓冲区可能适合您的问题吗?

于 2012-10-22T09:47:17.037 回答