std::get_deleter
| Определено в заголовочном файле <memory>
|
||
template< class Deleter, class T > Deleter* get_deleter( const std::shared_ptr<T>& p ) noexcept; |
(начиная с C++11) | |
Предоставляет доступ к средству удаления p. Если общий указатель p владеет средством удаления типа cv-неквалифицированного Deleter (например, если он был создан с помощью одного из конструкторов, принимающих средство удаления в качестве параметра), то возвращает указатель на средство удаления. Иначе возвращает нулевой указатель.
Параметры
| p | — | общий указатель, к средству удаления которого необходимо получить доступ |
Возвращаемое значение
Указатель на собственное средство удаления или nullptr. Возвращённый указатель действителен по крайней мере до тех пор, пока остаётся хотя бы один экземпляр std::shared_ptr, которому оно принадлежит.
Примечание
Возвращённый указатель может пережить последний std::shared_ptr, если, например, остались std::weak_ptr и реализация не уничтожит средство удаления до тех пор, пока не будет удалён весь управляющий блок.
Пример
демонстрирует, что средство удаления класса std::shared_ptr не зависит от типа std::shared_ptr
#include <iostream>
#include <memory>
struct Foo { int i; };
void foo_deleter(Foo * p)
{
std::cout << "foo_deleter вызвана!\n";
delete p;
}
int main()
{
std::shared_ptr<int> aptr;
{
// создёт shared_ptr, которому принадлежат Foo и средство удаления
auto foo_p = new Foo;
std::shared_ptr<Foo> r(foo_p, foo_deleter);
aptr = std::shared_ptr<int>(r, &r->i); // псевдоним конструктора
// aptr теперь указывает на int, но управляет всем Foo
} // r уничтожается (средство удаления не вызывается)
// получает указатель на средство удаления:
if(auto del_p = std::get_deleter<void(*)(Foo*)>(aptr))
{
std::cout << "shared_ptr<int> владеет средством удаления\n";
if(*del_p == foo_deleter)
std::cout << "...и оно равно &foo_deleter\n";
} else
std::cout << "Средство удаления shared_ptr<int> равно null!\n";
} // средство удаления вызывается здесь
Вывод:
shared_ptr<int> владеет средством удаления
...и оно равно &foo_deleter
foo_deleter вызвана!
Смотрите также
| конструкторы std::shared_ptr (public функция-элемент) | |
| возвращает средство удаления, которое используется для уничтожения управляемого объекта (public функция-элемент std::unique_ptr)
|