Ten kod działa dobrze, ale daje ostrzeżenie kompilatora na Rust nightly (1,2)Prawidłowe idiom za uwolnienie repr (C) konstrukcjom użyciu Opadowej cechę
#[repr(C)]
struct DbaxCell {
cell: *const c_void
}
#[link(name="CDbax", kind="dylib")]
extern {
fn new_dCell(d: c_double) -> *const c_void;
fn deleteCell(c: *const c_void);
}
impl DbaxCell {
fn new(x: f64) -> DbaxCell {
unsafe {
DbaxCell { cell: new_dCell(x) }
}
}
}
impl Drop for DbaxCell {
fn drop(&mut self) {
unsafe {
deleteCell(self.cell);
}
}
}
To linki do biblioteki C i tworzy/usuwanie obiektów komórkowych poprawnie . Jednak daje ostrzeżenie
src\lib.rs:27:1: 33:2 warning: implementing Drop adds hidden state to types, possibly conflicting with `#[repr(C)]`, #[warn(drop_with_repr_extern)] on by default
\src\lib.rs:27 impl Drop for DbaxCell {
\src\lib.rs:28 fn drop(&mut self) {
\src\lib.rs:29 unsafe {
\src\lib.rs:30 deleteCell(self.cell);
\src\lib.rs:31 }
\src\lib.rs:32 }
Jaki jest właściwy sposób to zrobić, aby upewnić się, że te DbaxCell
s są czyszczone prawidłowo i nie jest ostrzeżenie?
Niski poziom programistów, nie martw się: przyszłość rdza usunie ta flaga kropla całkowicie. – bluss
@bluss: Czy masz jakąś oś czasu? To też mnie denerwowało ... –
[Problem ze śledzeniem] (https://github.com/rust-lang/rust/issues/5016). Jest najnowszy postęp, więcej niż się tam pojawia. Mam nadzieję, że będzie to w tym roku. – bluss