172 похожих чатов

У меня есть уточняющий вопрос по использованию mem::forget и mem::copy. Есть

Sized + 'static структура. Два инстанса этой структуры хранятся в в куче. У меня есть NonNull указатели на данные инстансы.

Я получаю мутабельную ссылку на первый указатель, и превращаю второй указатель в Box<T>. Данные из Box я частично переношу, а частично побайтово копирую(через copy_nonoverlapping). После этого фактическим "владельцем" всех данных становится первый инстанс. Соответственно, мне нужно удалить содержимое Box<T> не вызывая деструкторы, но освобождая память в куче. Для этого я делаю mem::forget(*second_boxed).

Уточнить я хотел бы следующие момента:

1. Легитимна ли данная схема с точки зрения safety и с точки зрения менеджмента памяти?
2. NonNull указатель на второй объект по сути становится невалидным. Легитимно ли хранить такой указатель, не приводя его к ссылкам? И вообще чем он отличается от NonNull::dangling?
3. Если моя структура содержала atomic значения, что с ними произойдёт в момент копирования?

3 ответов

7 просмотров

раз никто не пишет, тогда я напишу (просто самому хотелось получить более развернутый ответ...) /// 1. про легитимна или нет я не знаю что за second_box и как вам так точно удалось вызвать деструктор Box ведь его код генится компилятором.. Но вам точно надо убедиться в том что вы освободите T и все?! а про освободить(данные в куче) Box но при этом не вызвать деструктор T я бы привел Box через трансмут например к Box<ManuallyDrop<T>> и вызвал деструктор Box получив освобождение по куче но без освобождения по T. (или напрямую дергать апи Allocator и его deallocate) 2. указатель может быть невалидным, а вот ссылки не должны. NonNull требует выравнивания и что-то там еще(??), а dangling (заметь что указатель который генит dangling по документации указывает в фиг знает куда, и UB при чтении или записи) по идее должен просто генерировать не null указатель(+выравнивание и что-то там еще) и по итогу генить NonNull 3. про копирование атомарных значений... я пытался например по c++ точную документацию, но так особо путного не нашел.. но нашел парочку вещей в std.. по памяти атомар должен быть как и тот тип что ты задействовал(UnsafeCell + T), тоесть копировать его можно, есть даже функции намекающие на прямое взаимодействие со значением без атомара (например fn get_mut(&mut self) -> &mut bool) одно дело то что ты скорее нарушишь атомарную очередь (я не знаю как ты там копировал атомар...)

Ilya-Lakhin Автор вопроса
Денис Котляров
раз никто не пишет, тогда я напишу (просто самому ...

Спасибо за ответ. А чем кастование к Box<ManuallyDrop<T>> лучше просто удаления через forget(T)?

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Карта сайта