У меня есть класс С++, который записывает свои данные в двоичный файл std::ofstream
. Класс хранит данные как boost:shared_array
, но я устранил это как проблему. Проблема заключается в вызове write()
на ofstream
.
Проблема в том, что это, кажется, утечка памяти. Система, на которой он работает, — CentOS 64bit, GCC 4.1.2.
При просмотре top
и free
во время работы приложения сам исполняемый файл не продолжает потреблять память (как подтверждается профилировщиком памяти в Netbeans), но объем свободной системной памяти со временем уменьшается. Более того, когда приложение завершает работу, эта память не освобождается!
Это особая проблема, потому что цель состоит в том, чтобы непрерывно записывать на диск со скоростью около 50 МБ / с в течение нескольких часов подряд. Однако, как только мы получаем около 90 МБ свободной системной памяти, кажется, что она «стабилизируется» и больше не сокращается, и приложение продолжает работать нормально. Однако это портит систему для других запущенных процессов, что плохо, ммкей.
Ниже приведена слегка упрощенная версия класса, вызывающего горе.
class WritableMessage
{
public:
WritableMessage();
void write(std::ofstream* const idxStream, std::ofstream* const dataStream);
private:
IdxRecord m_idx;
boost::shared_array<char> m_data;
};
Потоки ofstream инициализируются и уничтожаются в другом месте, но по существу они остаются открытыми для записи «навсегда».
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();
}
when the application is running the executable itself does not continue to consume memory (as backed up by the memory profiler in Netbeans), but the amount of free system memory does decrease over time. What's more, when the application exits this memory is not reclaimed!
Весьма подозрительно. - person Lightness Races in Orbit   schedule 21.06.2011