Я хочу сделать этот проект на C ++ и покончить с ним раз и навсегда: выберите mov ie из списка в одном окне и отобразите детали mov ie в другом окне.
Я уже пришел к решению Реми Лебо здесь и нашел его сообщение, потому что осознал то же ограничение, что и он: оно предоставляет необработанный указатель на утечку памяти.
( Извините, пожалуйста, за мой стиль кодирования).
MoviesWindow::MovieSelected( const unsigned int uint__MovieKey )
{ ...
std::unique_ptr<MovieBean> uptr__MovieBean = std::make_unique...
...
uptr__MovieBean->SetMovieTitle( row["MovieTitle"] );
uptr__MovieBean->SetYearReleased( row["YearReleased"] );
...
SendMessage( hwnd__MovieWindow, UWM_SendMovieBean, 0, (LPARAM) uptr__MovieBean->get() );
...
}
К счастью, у меня есть преимущество с SendMessage()
: он не закончится (освобождая std::unique_ptr
) до тех пор, пока обработчик сообщений не вернется, а работа обработчика сообщений состоит в том, чтобы клонировать MovieBean
.
MovieWindow::HandleUwmSendMovieBean( const HWND hwnd__MovieWindow, const UINT uint__WindowMessage, const WPARAM wParam, const LPARAM lParam )
{ UPTR__MovieBean = std::move( (*((MovieBean*) lParam).Clone() );
...
}
Кажется, правильный способ сделать это - оставить право собственности на std::unique_ptr
с MovieSelected()
до фактического момента передачи, отправив ссылку на обработчик и используя std::move
в ссылке.
MoviesWindow::MovieSelected( const unsigned int uint__MovieKey )
{ ...
SendMessage( hwnd__MovieWindow, UWM_SendMovieBean, 0, (LPARAM) &uptr__MovieBean );
...
}
Но я не могу понять, как получить ссылку из lParam
в std::move
. Казалось бы, это один, но нет.
MovieWindow::HandleUwmSendMovieBean( const HWND hwnd__MovieWindow, const UINT uint__WindowMessage, const WPARAM wParam, const LPARAM lParam )
{ UPTR__NewMovieBean = std::move( reinterpret_cast<std::unique_ptr<MovieBean>*>( lParam ) );
...
}
Я пробовал все возможные комбинации и удостоверился, что отправленный адрес является адресом, полученным и переданным в std :: move. Все, что я получаю, - это постоянные ошибки компилятора (включая ненавистную теперь около std::remove_reference
) и сбои. Приветствуется любое понимание.