У меня есть код, который реализует пул динамической памяти. Пул начинается с размера 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_;
}
push_back
. Если пул заполнен, вместо вызоваpush_back
и увеличенияchecked_in
вызовитеfree
и не увеличивайтеchecked_in
.) А что делать сchecked_in
? -- это идеально дублируетpool_.size()
. Зачем отслеживать одно и то же дважды? - person David Schwartz   schedule 16.04.2013