C++ c++;使用缓冲区写入文件时内存泄漏

C++ c++;使用缓冲区写入文件时内存泄漏,c++,memory-leaks,C++,Memory Leaks,我有一个在Linux系统上激活了许多线程的系统。每个线程分配一个特定大小的缓冲区,当该缓冲区已满时,将其写入文件。每个线程都有自己的缓冲区,并将缓冲区写入不同的文件。我发现,当我将缓冲区大小设置为相对较大(1M或更大)时,我开始遭受内存泄漏。但是,当缓冲区很小(大约1K或更少)时,我没有这些内存泄漏 有人知道是什么原因吗?更重要的是,我如何克服这个问题?使用较小的缓冲区会严重影响系统的性能 写入缓冲区- 否则如果(m_bUseBuffer) { //数据缓冲区现在已满 如果(m_nBufferS

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

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

写入缓冲区- 否则如果(m_bUseBuffer) { //数据缓冲区现在已满 如果(m_nBufferSize+pi_ndalength>=cMaxSizeQLoaderFileBuffer) { hRes=WriteDataofile(); }

        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();
                }
            }

当是从类型-std::of stream

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


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

是否可以将线程(或其缓冲区)包装在包装器中?即,使用重载的私有new运算符堆栈分配的包装器对象(以防止意外的堆分配)缓冲区的堆分配发生在构造函数中,反分配发生在析构函数中


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

如果没有更多详细信息,几乎不可能回答此问题。正如@karoly所建议的,如果您的代码正确,缓冲区大小无关紧要


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

如果不看一些复制的示例代码,就看不到。你能给我们一些代码吗?含糊不清的问题会产生含糊不清的回答。你怎么知道你看到内存泄漏?也许问题实际上是内存碎片?我用一个简单的top看到泄漏。我将尝试给出下面的相关代码。top不表示内存泄漏。当您释放内存时,它会返回到您的程序,而不必返回到系统。这只会在您退出程序时发生。因为top表示系统可用的内存,它可以表示您的程序正在使用越来越多的内存,但它本身并不意味着内存泄漏。如果您想释放我要返回系统,您必须执行更复杂和特定于平台的内存管理。Valgrind-我尝试过但没有给出任何响应。我猜代码有问题,但这种行为很奇怪。我假设您看到了Valgrind头(它启动了,等等)。如果没有报告,就没有memleak。。。(注意:只要有一个指针指向分配的空间,就不会被视为泄漏)我会尝试使用固定长度并告诉您它是如何运行的。但是我只分配了一次缓冲区,并在代码中重复使用它,而不会重新分配它。
            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;
    }