使用缓冲区写入文件时,C 内存会泄漏
c++ memory leaks when using buffer to write to file
我有一个系统,该系统在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建议的那样,如果您的代码正确 - 缓冲区大小就没关系。
我能想到的一件事当缓冲尺寸重要时,当缓冲区大小太大时,可能会有某些分配失败。然后,当发生这种情况时,您的代码可能在这种情况下不会很好地清洁(要么不会捕获异常,要么没有测试错误条件)。
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏