流量泄漏记忆

时间:2011-06-21 10:48:36

标签: c++ memory-leaks ofstream

我有一个C ++类,它将数据写入二进制文件std::ofstream。该类将数据存储为boost:shared_array,但我已将此消除为问题。问题在于write()上对ofstream的调用。

问题在于它似乎泄漏了内存。它运行的系统是CentOS 64bit,GCC 4.1.2。

当应用程序运行时查看topfree时,可执行文件本身不会继续消耗内存(由Netbeans中的内存分析器备份),但是可用系统内存量随着时间的推移会减少更重要的是,当应用程序退出此内存时,不会回收!

这是一个特殊的问题,因为它的目的是连续几小时以50MB / s的速度连续写入磁盘。但是,一旦我们降低到大约90MB的可用系统内存,它似乎“稳定”并且不再进一步减少,应用程序继续运行正常。然而,它确实搞砸了其他正在运行的进程的系统,这很糟糕,mmkay。

下面是导致悲痛的类的一个稍微简化的版本。

class WritableMessage
{
public:
    WritableMessage();
    void write(std::ofstream* const idxStream, std::ofstream* const dataStream);

private:
    IdxRecord m_idx;
    boost::shared_array<char> m_data;
};

在其他地方对游戏进行初始化和破坏,但基本上它们仍然可以“永远”写作。

void WritableMessage::write(std::ofstream* const idxStream, std::ofstream* const dataStream)
{
    //Call the IdxRecord to write itself (just a call to idxStream->write())
    m_idx.write(idxStream, dataStream->tellp());

    //This is the main issue, because this data can be up to about 2MB in size
    //for each write.  Commenting out this line removes all issues with the memory leak
    dataStream->write(m_data.get(), m_idx.getMessageSize());

    //I'd expect the flush to clear any buffers that the ofstream maintains,
    //but apparently not
    idxStream->flush();
    dataStream->flush();
}

2 个答案:

答案 0 :(得分:4)

看起来你没有问题,那就是系统缓存按预期工作。 Linux在缓存方面非常激进,因此它将使用几乎所有可用内存,但每当应用程序需要更多内存时,它将释放一些内存并将其授予应用程序。

答案 1 :(得分:3)

使用vmstat(man page

vmstat -S m 1

它将显示缓存和缓冲区内存。请注意,缓冲区内存是易失性的,一旦应用程序请求它就会自动释放。

我可以通过登录轻松显示对我的8GB桌面(linux)的影响,只做'dd if = / dev / sda of = / dev / null';缓冲存储器将稳定消耗所有可用存储器。

这是设计

一些相关链接: