Информация об изменениях

Сообщение Re: shared_ptr/make_shared и делитер, довесить доп обработку от 29.03.2024 10:01

Изменено 29.03.2024 10:17 Chorkov

Re: shared_ptr/make_shared и делитер, довесить доп обработку
Здравствуйте, пффф, Вы писали:

П>Какие есть варианты?


Можно унаследоваться от требуемого класса, (или включить класс в другой в качестве члена класса), и выполнить действия в производном классе.

С другой стороны, если не жалко лишнею аллокацию, то можно прицепить мониторинг вызова деструктора к уже существующему умному указателю.

template<class A, class OnExit>
std::shared_ptr<A>
monitor_pointer_lifetime( std::shared_ptr<A> ptr, OnExit on_exit )
{
    A* raw_ptr = ptr.get();
    auto deleter=[ptr=std::move(ptr), on_exit=std::move(on_exit)](void*) { on_exit(); };   
    return std::shared_ptr<A>( raw_ptr, std::move(deleter) );
}


Я таким образом искал утечку умных указателей, прикручивая счетчики числа живых объектов, выданных разными способами.
Re: shared_ptr/make_shared и делитер, довесить доп обработку
Здравствуйте, пффф, Вы писали:

П>Какие есть варианты?


Можно унаследоваться от требуемого класса, (или включить класс в другой в качестве члена класса), и выполнить действия в производном классе.

С другой стороны, если не жалко лишнею аллокацию, то можно прицепить мониторинг вызова деструктора к уже существующему умному указателю.

template<class A, class OnExit>
std::shared_ptr<A>
monitor_pointer_lifetime( std::shared_ptr<A> ptr, OnExit on_exit )
{
    A* raw_ptr = ptr.get();
    auto deleter=[ptr=std::move(ptr), on_exit=std::move(on_exit)](void*) { on_exit(); };   
    return std::shared_ptr<A>( raw_ptr, std::move(deleter) );
}


пример

Я таким образом искал утечку умных указателей, прикручивая счетчики числа живых объектов, выданных разными способами.