W ostatnim overload journal w temacie wprowadzająca zasadę zera, autorzy opisują w jaki sposób możemy uniknąć pisania regułę pięciu operatorów jako przyczyny ich pisanie to:C++ Reguła Zero: polimorficzny usunięć i unique_ptr zachowanie
- zarządzanie zasobami
- polimorficzne usunięcie
I obie te mogą być załatwione za pomocą inteligentnych wskaźników.
Tutaj szczególnie interesuje mnie druga część.
Rozważmy następujący fragment kodu:
class Base
{
public:
virtual void Fun() = 0;
};
class Derived : public Base
{
public:
~Derived()
{
cout << "Derived::~Derived\n";
}
void Fun()
{
cout << "Derived::Fun\n";
}
};
int main()
{
shared_ptr<Base> pB = make_shared<Derived>();
pB->Fun();
}
w tym przypadku, jak autorzy artykułu wyjaśnić, otrzymujemy polimorficzny usunięcie za pomocą udostępnionego wskaźnik, i to działa.
Ale jeśli zastąpię shared_ptr
z unique_ptr
, nie jestem już w stanie obserwować polimorficznej delecji.
Teraz moje pytanie brzmi: dlaczego te dwa zachowania różnią się od siebie? Dlaczego shared_ptr
zajmuje się usuwaniem polimorficznym, podczas gdy unique_ptr
nie?
jak inicjujesz 'unique_pointer'? –
Czy to ma znaczenie? Tak czy inaczej: unique_ptr pB (new Derived()) –
Arun
Ponieważ 'std :: shared_ptr' przenosi wskaźnik do funkcji deletera. Kiedy przypisujesz jedną 'std :: shared_ptr' do kompatybilnej, wskaźnik jest jednym z członków skopiowanych lub przeniesionych. Nie dzieje się tak z 'std :: unique_ptr', a ponieważ twoja klasa bazowa nie ma wirtualnego destruktora, dostajesz tryb bez kości. –