Size: a a a

2019 December 06

M

MrSmith in // CIPHERNET
Что бы инвалидировать указатель надо что то сделать с внутреними данными
источник

G

Gymmasssorla in // CIPHERNET
MrSmith
Они не инвалидируются при перемешении
инвалидируются - значит на мусор указывают
источник

M

MrSmith in // CIPHERNET
Дак не указывают никогда
источник

G

Gymmasssorla in // CIPHERNET
сейчас покажу
источник

M

MrSmith in // CIPHERNET
Хз просто курсор на единицу увеличиваешь пока он не равен N-1 и выдаешь Index или оффсетом элементы
источник

M

MrSmith in // CIPHERNET
Все должно пахать
источник

G

Gymmasssorla in // CIPHERNET
#![feature(const_generics)]

struct Foo<T, const N: usize> {
   array: [T; N],
   first: *mut T,
}

fn consume(foo: Foo<i32, 3>) {
   unsafe { *foo.first = 12i32 };
}

fn main() {
   let mut array = [1, 2, 3];
   let first = array.as_mut_ptr();
   let foo = Foo {
       array, first
   };
   unsafe { *foo.first = 22i32 };
   consume(foo);
}


Тут UB, потому что consume смувала массив и теперь first может указывать на мусор
источник

M

MrSmith in // CIPHERNET
Проблема скорей в том как сделать функции которыы выделают память. Я думаю делать прям объекты тип
let mut it = TreeWideIterator::new():
for node in it.apply(obj_tree){}
источник

M

MrSmith in // CIPHERNET
Gymmasssorla
#![feature(const_generics)]

struct Foo<T, const N: usize> {
   array: [T; N],
   first: *mut T,
}

fn consume(foo: Foo<i32, 3>) {
   unsafe { *foo.first = 12i32 };
}

fn main() {
   let mut array = [1, 2, 3];
   let first = array.as_mut_ptr();
   let foo = Foo {
       array, first
   };
   unsafe { *foo.first = 22i32 };
   consume(foo);
}


Тут UB, потому что consume смувала массив и теперь first может указывать на мусор
Тут возникает UB потому что ты явно нарушил состояние unsafe
источник

M

MrSmith in // CIPHERNET
У тебя слайс должен муваться в From() к примеру и владение памятью должно переходить к Foo
источник

G

Gymmasssorla in // CIPHERNET
если бы я передал мутабельную ссылку на foo в consume, то UB нет
источник

M

MrSmith in // CIPHERNET
Ты не передаешь владение а  захватываешь память просто без пладения тоесть по русски говоря ты репрезетуешь память в Foo но если ты такое делаешь без лайфтаймов то все на твоих руках
источник

G

Gymmasssorla in // CIPHERNET
источник

G

Gymmasssorla in // CIPHERNET
вот тут посмотри
источник

M

MrSmith in // CIPHERNET
Gymmasssorla
если бы я передал мутабельную ссылку на foo в consume, то UB нет
Ну я о том же зачем ты делать хочешь это
источник

M

MrSmith in // CIPHERNET
Да знаю я про Pin
источник

G

Gymmasssorla in // CIPHERNET
MrSmith
Ну я о том же зачем ты делать хочешь это
чтобы реализовать into_iter для массива
источник

G

Gymmasssorla in // CIPHERNET
MrSmith
Ты не передаешь владение а  захватываешь память просто без пладения тоесть по русски говоря ты репрезетуешь память в Foo но если ты такое делаешь без лайфтаймов то все на твоих руках
может произойти memmove при передаче владения
источник

G

Gymmasssorla in // CIPHERNET
MrSmith
Ну я о том же зачем ты делать хочешь это
там self-referential struct
источник

СВ

Саша Воронов in // CIPHERNET
очень выебистый ник, респектуха
источник