Функция needs_drop
Функция needs_drop проверяет, требует ли
указанный тип вызова деструктора при удалении
значения. Она возвращает true, если тип
нуждается в вызове деструктора, и false в
противном случае. Параметром функция принимает
обобщённый тип T, для которого выполняется
проверка.
Функция является безопасной и не требует блока
unsafe при вызове. Она полезна при
написании низкоуровневого кода, когда необходимо
знать, можно ли пропустить вызов деструктора
без утечки ресурсов.
Синтаксис
std::mem::needs_drop::<T>()
Пример
Давайте проверим, требует ли тип i32
вызова деструктора:
fn main()
{
let res = std::mem::needs_drop::<i32>();
println!("{}", res);
}
Результат выполнения кода:
false
Тип i32 не содержит ресурсов, требующих
освобождения, поэтому деструктор не нужен.
Пример
Давайте проверим, требует ли тип
String вызова деструктора:
fn main()
{
let res = std::mem::needs_drop::<String>();
println!("{}", res);
}
Результат выполнения кода:
true
Тип String владеет динамической памятью,
поэтому при удалении значения требуется вызов
деструктора для освобождения памяти.
Пример
Давайте проверим, требует ли вектор целых чисел вызова деструктора:
fn main()
{
let res = std::mem::needs_drop::<Vec<i32>>();
println!("{}", res);
}
Результат выполнения кода:
true
Тип Vec<i32> управляет буфером в куче,
поэтому нуждается в вызове деструктора.
Пример
Давайте проверим, требует ли ссылка на строку вызова деструктора:
fn main()
{
let res = std::mem::needs_drop::<&str>();
println!("{}", res);
}
Результат выполнения кода:
false
Ссылка не владеет данными, поэтому деструктор для неё не требуется.
Смотрите также
-
функция
drop,
которая явно вызывает деструктор значения -
функция
forget,
которая предотвращает вызов деструктора -
функция
drop_in_place,
которая вызывает деструктор по указателю -
тип
ManuallyDrop,
который управляет вызовом деструктора вручную