使用缓冲区写入文件时,C 内存会泄漏

c++ memory leaks when using buffer to write to file

本文关键字:内存 泄漏 文件 缓冲区      更新时间:2023-10-16

我有一个系统,该系统在Linux系统上已激活许多线程。每个线程都会在一定尺寸的情况下分配一个缓冲区,并且当此缓冲区完整时,将其写入文件。每个线程都有自己的缓冲区,并将缓冲区写入另一个文件。我发现,当我将缓冲尺寸设置为相对较大(1m尺寸或更大)时,我就会开始患有内存泄漏。但是,当缓冲区很小时(大约1K或更少)时,我没有这些内存泄漏。

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

写入缓冲区 - 否则(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

因为您的问题太模糊了,我只能给您一个通用的答案:使用valgrind检查您的代码,它将报告所有内存泄漏。

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

是否可以将线程(或其缓冲区)包装在RAII包装器中?也就是说,用超载的私人新运算符(以防止意外堆分配)分配的包装对象,并在构造函数中发生缓冲区的堆分配,并在destructor中发生分配?

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

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

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