У меня есть некоторый код здесь, который реализует динамический пул памяти. Пул начинается с размера 0 и увеличивается с каждым последующим выделением. Он используется для того, чтобы попытаться минимизировать издержки, связанные с тоннами выделений и выделений.
Вызов malloc НЕ соответствует вызову free. Похоже, что оно полагается на приложение, которое использует его, чтобы не вызывать достаточно новых подряд для того, чтобы приложение утекло значительный объем памяти.
Я не писал это, так что это мое лучшее предположение.
Мой вопрос:
Благодарю.
//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_;
}
Отсутствующее «бесплатное» означает, что вы не можете встроить это в какое-то более крупное приложение, запустить его, закрыть и вернуться в исходное состояние. Это хорошо, если вы управляете всем приложением, и не хорошо, если этот код должен быть фактически встраиваемым. Чтобы это работало, вам понадобится точка входа, которая обходит вектор, вызывая free.
Он никогда не просачивается в общепринятом смысле, так как каждый кусочек malloc сохраняется в векторе оператором delete для повторного использования, и оператор delete жалуется, если видит слишком много элементов в векторе.
Вы создаете пул памяти. Эта реализация пула будет расти по мере необходимости, но никогда не вернет память операционной системе. Обычно это ошибка, но не при создании собственного метода выделения памяти — пока этот пул существует на протяжении всей жизни вашей программы. Вы выйдете из программы, когда выйдет из программы, но вы, вероятно, можете с этим жить. По сути, вы переопределяете, как обычно работает new / malloc, и полностью делаете память самостоятельно.