inicjalizacja unique_ptr dla funkcji zwracającej zwykły wskaźnik

0

Witam,

czy taka inicjalizacja std::unique_ptr jak niżej jest prawidłowa ?

...

auto sheet = std::make_unique<BasicExcelWorksheet>(*xls->GetWorksheet(0));

...
//BasicExcel.cpp

BasicExcelWorksheet* BasicExcel::GetWorksheet(int sheetIndex)
{
	return &*(yesheets_[sheetIndex]);    // std::vector<SmartPtr<BasicExcelWorksheet> > yesheets_;
}
2

Tworzysz kopię obiektu (korzystasz z copy constructora), więc jeśli copy construktor jest prawidłowy, to powinno działać.

Biorąc jednak po uwagę nazwę klasy BasicExcelWorksheet mam wątpliwości czy na pewno chciałeś/powinieneś wykonać kopię obiektu.

0

właśnie nie chciałem, stąd moje pytanie (: czy żeby ominąć w tym przypadku kopiowanie trzeba dopisać konstruktor przenoszący do klasy BasicExcelWorksheet i użyć std::move ? czy może jest jakieś inne rozwiązanie bez ingerencji w kod tej klasy ?

3

To jak nie chciałeś robić kopii, to jest jeszcze gorzej. Jak nazwa wskazuje unique_ptr to wskaźnik, który jest jedynym właścicielem obiektu, a skoro twój wektor używa SmartPtr to znaczy, że to ktoś inny też trzyma własność do tego obiektu. Czyli skończy się to crashem "double free", bo najpierw unique_ptr usunie obiekt a potem SmartPtr.

Polecam cpp con 2016 z Herb Sutter, on wszystko ci dokładnie wyjaśni:

1 użytkowników online, w tym zalogowanych: 0, gości: 1