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

Temat: Wirtualny destruktor

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.Piotr P. edytował(a) ten post dnia 06.03.09 o godzinie 15:58

konto usunięte

Temat: Wirtualny destruktor

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.

Ale gry klasa ma oprócz tego kilka metod wirtualnych to jednak jest bzdura...Piotr L. edytował(a) ten post dnia 25.10.11 o godzinie 21:12
Michał Grygus

Michał Grygus Student, Akademia
Górniczo-Hutnicza
im. Stanisława
Staszi...

Temat: Wirtualny destruktor

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.

konto usunięte

Temat: Wirtualny destruktor

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.

Ostatnio miałem taki efekt:
- program działa bez zarzutu, kończy działanie i na końcu w etapie sprzątania sam RTL generuje nieskończoną listę wycieków...

Dla mnie to czyste kretyństwo że to jest nie wykrywane, choćby opcjonalnie. Tak samo zresztą nie wiem czy wykrywane są referencje do zmiennych stosowych zwracane jako wynik funkcji. Po cholerę jest to możliwe? Jedyne logiczne wytłumaczenie to zgodność wstecz...

Temat: Wirtualny destruktor

Jest wykrywane (opcjonalnie): http://msinilo.pl/blog/?p=183
(C4265)

konto usunięte

Temat: Wirtualny destruktor

Maciej Siniło:
Jest wykrywane (opcjonalnie): http://msinilo.pl/blog/?p=183
(C4265)

Dzięki za info, na pewno to wykorzystam.
Nie orientujesz się czy można w VS włączyć wszystkie warningi? /Wall
I jak? Chodzi oczywiście o IDE i właściwości projektu.

Temat: Wirtualny destruktor

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

Temat: Wirtualny destruktor

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.

Tak właśnie zrobiłem... Przy okazji znalazłem kilka ciekawych dodatkowych warningów. Dzięki.

konto usunięte

Temat: Wirtualny destruktor

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

Temat: Wirtualny destruktor

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

Właśnie dlatego jest to bzdura. To przykład jednego z elementów C++ które dawno powinny być zmienione, ale z jakichś względów już chyba nigdy nie będą.

Destruktor powinien być nie-wirtualny - tak jak konstruktor. Przecież i tak się wykona. No ale powinnien oczywiście działać poprawnie - zwalniać co trzeba.
Jedyny efekt braku "virtual" to właśnie wycieki które opisałeś.
Jeśli wiadomo że taki efekt może powstać to dlaczego by nie auto-unikać tego?

Gdyby C++ byłoby idealne nie powstałoby D (try/finally, foreach).

konto usunięte

Temat: Wirtualny destruktor

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
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 ;>
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.

konto usunięte

Temat: Wirtualny destruktor

Publiczy i wirtualny lub protected i nie-wirtualny.
http://www.gotw.ca/publications/mill18.htm
Guideline#4

konto usunięte

Temat: Wirtualny destruktor

Przemysław O.:
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
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 ;>
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.


Pisząc klasę nigdy nie możesz być pewien w jaki sposób
i gdzie wykorzysta ją "klient" to że ty będziesz używał ją na stosie jako typ konkretny który nie jest dziedziczony i nie dziedziczy
nie znaczy że ktoś nie wykorzysta jej w inny sposób
No chyba że piszesz klasy jedno razowe wyłącznie na użytek własny/firmy
w projekcie o zamkniętym kodzie ,ale mimo wszystko ja założe się że jeśli wychodzisz z założenia pisząc apsy że nie płaci się za coś czego się nie używa
to jest w nim cały multum bugów
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

Temat: Wirtualny destruktor

Virtual to dodatkowo narzut pamięci. Czy mały ? Zależy ile obiektów zrobisz i w jakim środowisku.
Dla mnie sprawa jest jasna:
1) klasa bez konstruktora wirtualnego nie jest klasą do dziedziczenia
2) klasa z destruktorem wirtualnym powinna być klasą abstrakcyjną i służy jako interface do dziedziczenia.
Całość związuje stwierdzenie, że w hierarchii tylko klasy liście tworzą obiekty. Wszystko co powyżej to interfejsy.

konto usunięte

Temat: Wirtualny destruktor

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

Temat: Wirtualny destruktor

Marcin Er:
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
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!

PS. O moje bugi sie nie martw. Rozmawiajmy na temat.

konto usunięte

Temat: Wirtualny destruktor

Adam Michalski:
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
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).

konto usunięte

Temat: Wirtualny destruktor

Dokładnie. Miał być destruktor wirtualny.

konto usunięte

Temat: Wirtualny destruktor

No więc mówię
"chyba że piszesz swoje klasy jako typy konkretne które nie są dziedziczone i nie dziedziczą"
Ja tam się przy swoim i tak będę upierał
brak wirtualnego konstruktora to najprostsza droga do wycieków pamięciMarcin Er edytował(a) ten post dnia 03.09.10 o godzinie 18:59



Wyślij zaproszenie do