Безопасно ли использовать замыкание для получения необработанного указателя из параметра < & amp; T & gt ;?

Используя встроенную функцию списка, вы можете сделать это

a
out:[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
#Displaying the list

a.remove(a[0])
out:[[1, 1, 1, 1], [1, 1, 1, 1]]
# Removed the first element of the list in which you want altered number

a.append([5,1,1,1])
out:[[1, 1, 1, 1], [1, 1, 1, 1], [5, 1, 1, 1]]
# append the element in the list but the appended element as you can see is appended in last but you want that in starting

a.reverse()
out:[[5, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
#So at last reverse the whole list to get the desired list
1
задан Stargateur 24 March 2019 в 05:44
поделиться

1 ответ

1116 Да, это безопасно. Я написал бы это как:

use std::ptr;

fn safe_wrapper(opt: Option<&u8>) {
    let p = opt.map_or_else(ptr::null, |x| x);
    unsafe { ffi_call(p) }
}

Если вы обнаружите, что пишете это много, вы можете превратить это в черту и сократить до одного вызова метода.

указатель может быть признан недействительным при прохождении через замыкание

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

Единственный способ для указателя стать недействительным - это изменить значение указателя (например, добавить к нему смещение). Так как ты этого не делаешь, это нормально.

Гарантирует ли Rust, что окончательный указатель будет указывать на то же, что и исходная ссылка?

Это зависит от того, что вы подразумеваете под «финалом». Преобразование ссылки на указатель всегда приведет к тому, что оба значения будут содержать одно и то же место в памяти. Все остальное было бы преднамеренно злонамеренным, и никто бы никогда не использовал Rust для начала.

Если T равно Copy, значит ли это изменить семантику значимым образом?

Нет. Кроме того, мы говорим о &T, который всегда всегда Copy

См. Также:


интерфейс FFI, который я использую, имеет семантику заимствования (я выделяю что-то и передаю указатель на него ]), а не семантика владения

Чтобы было ясно, вы не можете определить владение, основываясь исключительно на типах функций.

Эта функция C становится владельцем:

void string_free(char *)

Эта функция C заимствует:

size_t string_len(char *)

Оба получают указатель. Rust улучшает эту ситуацию, четко разграничивая, что такое заем и передача права собственности.

extern "C" {
    // Parameter may be null
    fn ffi_call(*const T);
}

Этот код не имеет смысла; он не определяет универсальный тип T, и функции FFI в любом случае не могут иметь универсальные типы.

0
ответ дан Shepmaster 24 March 2019 в 05:44
поделиться
Другие вопросы по тегам:

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