2012-08-12 19 views
8

Jeśli rozumiem poprawnie, gdy shared_ptr (z boost, tr1, std, cokolwiek) jest zainicjalizowane wskaźnikiem do świeżo przydzielonego obiektu, konstruktor shared_ptr przydziela niewielką ilość pamięci do przechowywania licznika referencyjnego dla wskaźnika zarządza. Co się stanie, jeśli alokacja się nie powiedzie? W poniższym kodzie:Co się stanie, jeśli konstruktor shared_ptr zakończy się niepowodzeniem?

class my_class {}; 
void my_func(shared_ptr<my_class> arg); 

int main(int argc, char* argv[]) 
{ 
    my_func(shared_ptr<my_class>(new my_class())); 
    return 0; 
} 

... będzie przedmiotem my_class być wyciekły jeśli shared_ptr nie może przydzielić pamięci dla jego liczenia odniesienia? Czy konstruktor shared_ptr bierze odpowiedzialność za usunięcie obiektu?

Odpowiedz

7

Twój kod nie wycieknie obiektu my_class, nawet jeśli shared_ptr nie może przydzielić pamięci.

Zgodnie ze standardem C++ 11 (20.7.2.2.1), w konstruktora shared_ptr:

Rzuty: bad_alloc, lub podane znaczenie wyjątkiem implementacji de gdy zasoby inne niż pamięć nie mógł uzyskać.

Bezpieczeństwo wyjątków: w przypadku wyjątku wywoływane jest usuwanie p.

W wersji konstruktora, która przyjmuje zdefiniowany przez użytkownika deleter, zamiast niego będzie używany deleter.

Boost documentation określa to samo.

+0

Pozdrawiam. Uruchomiłem Google, ale nie znalazłem odpowiedzi. Któregoś dnia nauczę się sprawdzać źródło - czyli standard. :-) – bythescruff

Powiązane problemy