Zmiana zwykłych wskaźników na shared_ptr skutkuje crashem programu

0

Zmieniam kod swojego programu, ze zwykłych wskaźników robię shared_ptr, a to w celu łatwego wprowadzenia nowej funkcjonalności (cofnij/ponów). Problem w tym, że teraz się sypie to, co wcześniej zawsze działało bez problemów ;_; Pokażę mniej więcej jak wygląda mój kod w miejscach z tymi wskaźnikami. Może ktoś zauważy babola. W inteligentnych wskaźnikach jestem nowy, gdzieś musiałem zrobić błąd w ich użyciu.

Okrojony kod do pokazania operacji, jakie robię na wskaźnikach:
http://4programmers.net/Pastebin/5751

Błąd:

pure virtual method called
terminate called without an active exception

Sprawdziłem linię, która powoduje ten błąd i wydaje się ok, wszystkie obiekty istnieją.

2
shared_ptr<Point>(this)

Tak się nie robi. W pewnym uproszczeniu, unique_ptr/shared_ptr możesz tworzyć wyłącznie jeden dla obiektu. Potem ten obiekt shared_ptr możesz kopiować - ale jeśli utworzysz nowy na podstawie tego samego wskaźnika to zostanie on 2 razy usunięty. Tak samo w przypadku usuwania obiektów niszczonych w inny sposób (np. mających automatyczny czas życia)

0

Rzeczywiście działo się tak jak mówisz. Co ciekawe, na ideone kod z takim błędem skutkuje komunikatem

double free or corruption
a u mnie cisza. Kwestia starości kompilatora czy czegoś jeszcze?

Częściowo mój problem rozwiązuje funkcja shared_ptr::get, ale jeszcze w kilku miejscach mam tak, że spodziewany jest shared_ptr ale muszę przekazać this (np. dodawanie do vectora, przekazywanie wskaźnika do funkcji). Jakieś pomysły na to?

1

Nie lubię shared_ptr bo jest kapitulacją jeśli chodzi o sprawę czasu życia obiektów i zdaniem się całkowicie na shared_ptr.
Próbując „poprawić” działający program tylko go popsułeś.

Uważam że lepszy jest unique_ptr bo daje automatyzację destrukcji obiektów zgodnie z RAII, a z zachowaniem pełnej kontroli.

0

Wszystko już działa jak powinno.
Gdyby nie to, że shared_ptr ułatwią mi wprowadzenie nowych funkcjonalności, to bym nie "naprawiał". Myślę, że shared_ptr nie jest tu nadużyciem. Mam w programie punkty (klasa Point) i wskaźniki do tych punktów są przechowywane w obiektach klasy trzymających informacje co z czym jest połączone. Za chwilę będę te wskaźniki dodawał do vectora trzymającego historię.

0

Porównaj sizeof(shared_ptr<Point>) i sizeof(Point). Jeśli widoczność zmian z różnych punktów systemu nie jest niezbędna (do historii raczej nie?) to odpuść sobie tak duży overhead.

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