Raw pointer CreateProcess

В общем нужно заюзать CreateProcessW и передать в STARTUPINFOW параметр lpTitle (или не передать, в зависимости от значения Option), пытался сделать так:

...
let cl_title: Option<Vec<u16>> = startup_info.lp_title.map(|s| OsStr::new(s).encode_wide().chain(once(0)).collect());
...
let mut the_startup_info: STARTUPINFOW = STARTUPINFOW
    {
        cb: std::mem::size_of::<STARTUPINFOW>() as u32,
        lpReserved: std::ptr::null_mut(),
        lpTitle: lp_title,
     ...
    }
...
CreateProcessW(...)

Всё запускается нормально, но в качестве заголовка окна консоли – ерунда, из чего я делаю вывод о том, что к моменту вызова CreateProcessW память освобождается, как сделать правильно?

Предположение интересное. Не могу подтвердить, что именно это является причиной, но если оно, то решение должно быть таким:

  1. Создаешь Box<Vec<u16>> (Можешь воспользоваться https://doc.rust-lang.org/std/vec/struct.Vec.html#method.into_boxed_slice)
  2. Получаешь указатель в хип с помощью https://doc.rust-lang.org/std/boxed/struct.Box.html#method.into_raw
  3. Передаешь этот указатель в STARTUPINFOW
  4. Когда процесс умирает, достаешь указатель и преобразуешь его в Box с помощью https://doc.rust-lang.org/std/boxed/struct.Box.html#method.from_raw, чтобы не было утечки памяти.

Спасибо за ответ. Глянул в отладчике, там действительно освобождается эта память:

000000013FC75C80 | E8 3BD8FFFF   | call <func_hooker-6d0ee1cb73b04f83.core::ptr::real_drop_in_place<alloc::vec::Vec<u16>>>                        |

Буду пробовать с Box.

В общем сделал, как вы и советовали – с Box-ом:

pub struct RawStr
{
    the_slice: Option<*mut [u16]>,
    the_str: *mut u16,
}

impl RawStr
{
    pub fn new(the_str: Option<&str>) -> RawStr
    {
        match the_str
        {
            None => RawStr
            {
                the_slice: None,
                the_str: std::ptr::null_mut(),
            },

            Some(v) =>
            {
                let sstr = Box::into_raw(v.encode_utf16().chain(once(0)).collect::<Vec<u16>>().into_boxed_slice());
                RawStr
                {
                    the_slice: Some(sstr),
                    the_str: sstr as *mut u16,
                }
            }
        }
    }

    pub fn free(self)
    {
        match self.the_slice
        {
            None => {},
            Some(v) =>
            {
                unsafe {Box::from_raw(v);}
            },
        }
    }

    pub fn get_raw(&self) -> *mut u16
    {
        self.the_str
    }
}

Структуру STARTUPINFO можно уничтожать сразу после создания нового процесса, не дожидаясь его завершения.
Да, и предложенный в этом посте вариант всё равно оставляет у меня чувство кривости, хотя, может быть я придираюсь – х/з.