konto usunięte
Temat: Wirtualny destruktor
Czy ktoś wie dlaczego nie-wirtualny destruktor nie wzbudza zainteresowania kompilatora (choćby mały warning) w VS skoro powszechnie wiadomo czym to grozi?Jest jakiś tool do wykrywania takich bzdur?
konto usunięte
konto usunięte
Piotr Likus:
Czy ktoś wie dlaczego nie-wirtualny destruktor nie wzbudza zainteresowania kompilatora (choćby mały warning) w VS skoro powszechnie wiadomo czym to grozi?
Jest jakiś tool do wykrywania takich bzdur?
konto usunięte
Piotr P.:
Piotr Likus:
Czy ktoś wie dlaczego nie-wirtualny destruktor nie wzbudza zainteresowania kompilatora (choćby mały warning) w VS skoro powszechnie wiadomo czym to grozi?
Jest jakiś tool do wykrywania takich bzdur?
Nie bardzo rozumiem dlaczego uważasz za bzdurę niewirtualny destruktor.
Jeżeli klasa z takim destruktorem nie jest klasą bazową do dziedziczenia nie ma problemu.
Wirtualny destruktor jest konieczny w sytuacji gdy klasa służy jako bazowa do dziedziczenia.
Michał
Grygus
Student, Akademia
Górniczo-Hutnicza
im. Stanisława
Staszi...
konto usunięte
Michał Grygus:
Nigdy jakoś na to szczególnie uwagi nie zwracałem, czy tak bardzo ci to przeszkadza? swoją drogą ciekawy czy jest jakieś logiczne wytłumaczenie dlaczego czegoś takiego nie zaimplementowano.
Chociaż jakoś nie miałem z tym wpadki,a tak poza tym zawsze można jakimś programem sprawdzić wycieki w czasie działania programu chociażby valgrindem.
Maciej Siniło Programista
konto usunięte
Maciej Siniło:
Jest wykrywane (opcjonalnie): http://msinilo.pl/blog/?p=183
(C4265)
Maciej Siniło Programista
konto usunięte
Maciej Siniło:
Properties -> C/C++ -> Command Line -> Additional Options. Problem z /Wall jest taki, ze wtedy Visual wyklada sie nawet na wlasnych naglowkach :) Dlatego zrezygnowalem i wlaczam wybrane warningi #pragmami.
konto usunięte
konto usunięte
Marcin Er:
Wirtualny destruktor a właściwie jego brak to nie żadna bzdura
W przypadku jego braku i przy jednoczesnej obecności dynamicznego rzutowania
(wykorzystania typów polimorficznych) brak vd
to najprostsza droga do powstawania wycieków pamięci
konto usunięte
Marcin Er:Nie zgadzam sie. Czy powinien to kwestia dyskusyjna, moze metody tez wszystkie powinny byc wirtualne jak w innych jezykach? W C++ jest zasada, ze nie placi sie za cos czego sie nie zamawialo. Proste. Poza warningami polecam jeszcze tool do statycznej analizy kodu w C++, CppCheck. Rzadko sie myli, super sprawa.
Wirtualny destruktor a właściwie jego brak to nie żadna bzdura
W przypadku jego braku i przy jednoczesnej obecności dynamicznego rzutowania
(wykorzystania typów polimorficznych) brak vd
to najprostsza droga do powstawania wycieków pamięci
czego konsekwencją w pewnych okolicznościach może być denial of service
Dlatego każdy destruktor powinien być virtualny na dzień dobry
Dzień dobry chciałem się przywitać tylko ;>
konto usunięte
konto usunięte
Przemysław O.:
Marcin Er:Nie zgadzam sie. Czy powinien to kwestia dyskusyjna, moze metody tez wszystkie powinny byc wirtualne jak w innych jezykach? W C++ jest zasada, ze nie placi sie za cos czego sie nie zamawialo. Proste. Poza warningami polecam jeszcze tool do statycznej analizy kodu w C++, CppCheck. Rzadko sie myli, super sprawa.
Wirtualny destruktor a właściwie jego brak to nie żadna bzdura
W przypadku jego braku i przy jednoczesnej obecności dynamicznego rzutowania
(wykorzystania typów polimorficznych) brak vd
to najprostsza droga do powstawania wycieków pamięci
czego konsekwencją w pewnych okolicznościach może być denial of service
Dlatego każdy destruktor powinien być virtualny na dzień dobry
Dzień dobry chciałem się przywitać tylko ;>
konto usunięte
konto usunięte
Michał Rotkiewicz:
Dla mnie sprawa jest jasna:
1) klasa bez konstruktora wirtualnego nie jest klasą do dziedziczenia
konto usunięte
Marcin Er:To nie moja filozofia tylko filozofia autorow jezyka. Gdyby filozifia byla inna to wszystko byloby virtual jak w Javie i nie byloby zadnych problemow. W C++ jest wybor, chcesz to uzywasz, nie to nie. Jesli jest to za trudne dla kogos to sa prostrze jezyki bez tych "problemow". Nie trzeba zawsze pisac virtual ~foo() {}; Maja to wbudowane!
No ale to twoja filozofia i masz do niej prawo
ja bym się nie odważył tak pisać obiektowego kodu
Po za tym "minimalizm" w C++ to kwestia na osobną książkę :)
wydaje mi się że całkowicie kłóci się on ze standardami jaki proponują ludzie opracowujący ten język
Oczywiście krążą takie mity że jest on równie wydajny a nawet bardziej wydajny od swojego protoplasty C i kilku innych języków z których się wywodzi
- może i tak ale na pewno nie gdy sztywno trzymamy się narzucanych standardów
Więc podejście "nie płace za coś ..." ma się nijak do czystego C++Marcin Er edytował(a) ten post dnia 03.09.10 o godzinie 11:46
konto usunięte
Adam Michalski:W poscie wyzej, to drobna pomylka ale jest taki design pattern w C++(wspomina sie o tym np tu: http://sourcemaking.com/design_patterns/factory_method).
Michał Rotkiewicz:
Dla mnie sprawa jest jasna:
1) klasa bez konstruktora wirtualnego nie jest klasą do dziedziczenia
Co to jest konstruktor wirtualny? :)Adam Michalski edytował(a) ten post dnia 03.09.10 o godzinie 13:05
konto usunięte
konto usunięte
Następna dyskusja: