Size: a a a

Rust — русскоговорящее сообществo

2020 August 27

JC

Julian =) Coffee in Rust — русскоговорящее сообществo
вафель 🧇
посмотреть что функция делает
Так если это либа, то никак и не узнаешь, разве нет?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Надо этот указатель обернуть в свой тип, вроде

struct PvigemBox {
 type: TargetType,
 ptr: NonNull<_VIGEM_TARGET_T>,
}
impl PvigemBox {
 pub fn new(tt: TargetType) -> Option<Self> {
   let raw = match tt { /* */ };
   NonNull::new(raw).map(|ptr| Self {type: tt, ptr})
 }
}
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Sergey Duck
Через дебагер?
Через исходники
источник

SD

Sergey Duck in Rust — русскоговорящее сообществo
Эрик
Надо этот указатель обернуть в свой тип, вроде

struct PvigemBox {
 type: TargetType,
 ptr: NonNull<_VIGEM_TARGET_T>,
}
impl PvigemBox {
 pub fn new(tt: TargetType) -> Option<Self> {
   let raw = match tt { /* */ };
   NonNull::new(raw).map(|ptr| Self {type: tt, ptr})
 }
}
> но вообще, так делать не надо, а надо этот указатель обернуть в свой тип, вроде

А зачем?
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
А, там сишная либа чтоли? Тогда в бокс оборачивать — UB
источник

Э

Эрик in Rust — русскоговорящее сообществo
Sergey Duck
> но вообще, так делать не надо, а надо этот указатель обернуть в свой тип, вроде

А зачем?
Чтобы потом сделать

impl Drop for PvigemBox {
 fn drop(&mut self) {
   match self.type {
     X => dealloc_X(self.ptr)
     Y => dealloc_Y(self.ptr)
   }
 }
}
источник

SD

Sergey Duck in Rust — русскоговорящее сообществo
вафель 🧇
А, там сишная либа чтоли? Тогда в бокс оборачивать — UB
А не оборачивать? не UB?
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Sergey Duck
А не оборачивать? не UB?
?_?

Бокс требует чтобы данные за указателем были аллоцированны глобальным растовым аллокатором. C-код про раст ничего не знает, у него свой аллокатор.
источник

SD

Sergey Duck in Rust — русскоговорящее сообществo
вафель 🧇
?_?

Бокс требует чтобы данные за указателем были аллоцированны глобальным растовым аллокатором. C-код про раст ничего не знает, у него свой аллокатор.
Что бокс требует?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Sergey Duck
Что бокс требует?
Чтобы указатель был совместим с Box.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А из C фиг знает что придёт.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Поэтому надо оборачивать в свой тип и нормальный дроп реализовывать.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А, там в vigem нет деаллокаций.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну значит утечёт на всё время жизни программы при аллокации.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Указатель потеряешь — совсем утечёт.
источник

SD

Sergey Duck in Rust — русскоговорящее сообществo
Эрик
Поэтому надо оборачивать в свой тип и нормальный дроп реализовывать.
А как дропать указатель?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Sergey Duck
А как дропать указатель?
Который ты из vigem получил — никак.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Там API не предусматривает дропа.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Там API не предусматривает дропа.
Почему это? А как же vigem_target_free?
источник

Э

Эрик in Rust — русскоговорящее сообществo
А, таки есть? Я просто dealloc искал.
источник