Читаем Rust на примерах полностью

==26873== For counts of detected and suppressed errors, rerun with: -v

==26873== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

Утечки отсутствуют!

<p id="Деструктор"><strong><a l:href="#Деструктор">Деструктор</a></strong></p>

Понятие деструктора в Rust обеспечивается через типаж Drop. Деструктор вызывается, когда ресурс выходит за пределы области видимости. Этот типаж не требуется реализовать для каждого типа. Реализовать его для вашего типа вам потребуется, только если требуется своя логика при удалении экземпляра типа.

Выполните пример ниже, чтобы увидеть, как работает типаж Drop. Когда переменная в функции main выходит за пределы области действия, будет вызван пользовательский деструктор.

struct ToDrop;

impl Drop for ToDrop {

fn drop(&mut self) {

println!("ToDrop is being dropped");

}

}

fn main() {

let x = ToDrop;

println!("Made a ToDrop!");

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<p id="Смотрите_также_44"><strong><a l:href="#Смотрите_также_44">Смотрите также:</a></strong></p>

Упаковка

<p id="Владение_и_перемещение"><strong><a l:href="#Владение_и_перемещение">Владение и перемещение</a></strong></p>

Поскольку переменные ответственны за освобождение своих ресурсов, ресурсы могут иметь лишь одного владельца. Это ограничение предотвращает возможность высвобождения ресурсов более одно раза. Обратите внимание, что не все переменные владеют своим ресурсом (например, ссылки).

При присваивании (let x = y) или при передаче функции аргумента по значению (foo(x)), владение ресурсами передаётся. В языке Rust это называется перемещением.

После перемещения ресурсов, переменная, владевшая ресурсами ранее, не может быть использована. Это предотвращает создание висячих указателей.

// Эта функция берёт во владение память, выделенную в куче

fn destroy_box(c: Box) {

println!("Уничтожаем упаковку, в которой хранится {}", c);

// `c` уничтожится, а память будет освобождена

}

fn main() {

// Целое число выделенное в стеке

let x = 5u32;

// *Копируем* `x` в `y`. В данном случае нет ресурсов для перемещения

let y = x;

// Оба значения можно использовать независимо

println!("x равен {}, а y равен {}", x, y);

// `a` - указатель на целое число, выделенное в куче

let a = Box::new(5i32);

println!("a содержит: {}", a);

// *Перемещаем* `a` в `b`

let b = a;

// Адрес указателя `a` копируется (но не данные) в `b`.

// Оба указателя указывают на одни и те же данные в куче, но

// `b` теперь владеет ими.

// Ошибка! `a` больше не может получить доступ к данным, потому что

// больше не владеет данными в куче.

//println!("a содержит: {}", a);

// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку

// Эта функция берет во владение память, выделенную в куче, которой ранее владела `b`

destroy_box(b);

// Поскольку в данный момент память в куче уже освобождена, это действие

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители