Должен ли вызов malloc соответствовать вызову free в пуле динамической памяти?

У меня есть некоторый код здесь, который реализует динамический пул памяти. Пул начинается с размера 0 и увеличивается с каждым последующим выделением. Он используется для того, чтобы попытаться минимизировать издержки, связанные с тоннами выделений и выделений.

Вызов malloc НЕ соответствует вызову free. Похоже, что оно полагается на приложение, которое использует его, чтобы не вызывать достаточно новых подряд для того, чтобы приложение утекло значительный объем памяти.

Я не писал это, так что это мое лучшее предположение.

Мой вопрос:

  1. Является ли отсутствие вызова для освобождения ошибки или я что-то упускаю из-за перегрузки оператора удаления?
  2. Эта реализация полагается на ОС, чтобы очистить небольшой объем памяти, который течет при выходе?

Благодарю.

//Obj.h
class Obj
{
public:
Obj(){};
void* operator new(std::size_t size);
void operator delete(void* p);
private:
static std::vector<void*> pool_;
static std::size_t checked_in_;
static std::size_t checked_out_;
};

//Obj.cpp
std::vector<void*> Obj::pool_;
std::size_t Obj::checked_out_ = 0;
std::size_t Obj::checked_in_  = 0;

void* Obj::operator new(std::size_t size)
{
if (pool_.empty())
{
++checked_out_;
return malloc(size);
}
else
{
--checked_in_;
++checked_out_;
void* p = pool_.back();
pool_.pop_back();
return p;
}
}

void Obj::operator delete(void* p)
{
pool_.push_back(p);
if (pool_.size() % 10000 == 0)
{
std::cout<<"mem leak\n";
}
--checked_out_;
++checked_in_;
}

0

Решение

Отсутствующее «бесплатное» означает, что вы не можете встроить это в какое-то более крупное приложение, запустить его, закрыть и вернуться в исходное состояние. Это хорошо, если вы управляете всем приложением, и не хорошо, если этот код должен быть фактически встраиваемым. Чтобы это работало, вам понадобится точка входа, которая обходит вектор, вызывая free.

Он никогда не просачивается в общепринятом смысле, так как каждый кусочек malloc сохраняется в векторе оператором delete для повторного использования, и оператор delete жалуется, если видит слишком много элементов в векторе.

0

Другие решения

Вы создаете пул памяти. Эта реализация пула будет расти по мере необходимости, но никогда не вернет память операционной системе. Обычно это ошибка, но не при создании собственного метода выделения памяти — пока этот пул существует на протяжении всей жизни вашей программы. Вы выйдете из программы, когда выйдет из программы, но вы, вероятно, можете с этим жить. По сути, вы переопределяете, как обычно работает new / malloc, и полностью делаете память самостоятельно.

0

По вопросам рекламы [email protected]