Ĺadny brzuch
Witam! :)
Jak zrobić, aby w poniższym programie usunąć egzemplarz nc2 poza blokiem, w którym został zadeklarowany(jeśli w ogóle to możliwe). Bo jak wyczytałem z MegaTutoriala to do operatora new w ogóle nie stosuje się pojęcia zasięgu.
#include <iostream> using namespace std; class newclass { int a, b, c; public: newclass() { Â a = b= c = 0; Â cout << "Konstrukcja...\n"; } ~newclass() { Â cout << "Destrukcja...\n"; } }; int main() { newclass nc1; { Â cout << "Definicja nc2...\n"; Â newclass *nc2 = new newclass; // czy można zrobić, aby nc2 zwolnić poza tym blokiem? } cout << "Koniec zasiegu nc2...\n"; delete nc2; // błąd!!! return 0; }
Za pomoc dzięki :)
Użytkownik comp123 edytował ten post 16 lipiec 2005, 17:48
Zadeklaruj wskaznik jako globalny ;)
Witam! :)
Jak zrobić, aby w poniższym programie usunąć egzemplarz nc2 poza blokiem, w którym został zadeklarowany(jeśli w ogóle to możliwe). Bo jak wyczytałem z MegaTutoriala to do operatora new w ogóle nie stosuje się pojęcia zasięgu.
code snippet removed;)
Za pomoc dzięki :)
Twoj przyklad to klasyczna sytuacja na piekny wyciek pamieci :). new utworzyl - ale zmienna (wskaznik) byla lokalna - po wyjsciu z bloku ulegla zniszczeniu, natomiast obiekt jest dalej w pamieci :).
Masz dwa wyjscia - albo to co TeMPOraL powiedzial, albo uzycie inteligentnych wskaznikow (np shared_ptr z boost-a). Nie bedziesz mial wtedy problemu bo shared_ptr sam zniszczy obiekt przy wyjsciu z bloku.
Osobiscie preferuje drugie rozwiazanie - w wiekszych projektach moze Ci uratowac zycie :)
// Edit - ofkoz pomijam fakt ze sam delete nie widzi "nc2" - chodzilo mi raczej o ten glebszy problem z wyciekami :)
Pozdr.
st3tc
Użytkownik st3tc edytował ten post 16 lipiec 2005, 19:42
(...) uzycie inteligentnych wskaznikow (np shared_ptr z boost-a). (...)
St3tc, pytanko: Ty używasz boost::shared_ptr, czy pisałeś własny? Ja w tej chwili używam własnego smart pointera w ramach garbage collectora.
Aktualnie boost-a. W sumie wystarcza mi - zabezpiezenie jest. Nie mialem juz sily/ochoty pisac wlasnych implementacji (odeszla mi przy pisaniu wlasnych kontenerow - z trudem dobilem do performance STLPort-a (ale przegralem w "kilku" testach :) ) i ... odpuscilem sobie - na pocieszenie (siebie) dodam ze rozwalilem w pyl dinkumware ;]).
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Jak zrobić, aby w poniższym programie usunąć egzemplarz nc2 poza blokiem, w którym został zadeklarowany(jeśli w ogóle to możliwe). Bo jak wyczytałem z MegaTutoriala to do operatora new w ogóle nie stosuje się pojęcia zasięgu.
#include <iostream> using namespace std; class newclass { int a, b, c; public: newclass() { Â a = b= c = 0; Â cout << "Konstrukcja...\n"; } ~newclass() { Â cout << "Destrukcja...\n"; } }; int main() { newclass nc1; { Â cout << "Definicja nc2...\n"; Â newclass *nc2 = new newclass; // czy można zrobić, aby nc2 zwolnić poza tym blokiem? } cout << "Koniec zasiegu nc2...\n"; delete nc2; // błąd!!! return 0; }
Za pomoc dzięki :)
Użytkownik comp123 edytował ten post 16 lipiec 2005, 17:48
Zadeklaruj wskaznik jako globalny ;)
Witam! :)
Jak zrobić, aby w poniższym programie usunąć egzemplarz nc2 poza blokiem, w którym został zadeklarowany(jeśli w ogóle to możliwe). Bo jak wyczytałem z MegaTutoriala to do operatora new w ogóle nie stosuje się pojęcia zasięgu.
code snippet removed;)
Za pomoc dzięki :)

Twoj przyklad to klasyczna sytuacja na piekny wyciek pamieci :). new utworzyl - ale zmienna (wskaznik) byla lokalna - po wyjsciu z bloku ulegla zniszczeniu, natomiast obiekt jest dalej w pamieci :).
Masz dwa wyjscia - albo to co TeMPOraL powiedzial, albo uzycie inteligentnych wskaznikow (np shared_ptr z boost-a). Nie bedziesz mial wtedy problemu bo shared_ptr sam zniszczy obiekt przy wyjsciu z bloku.
Osobiscie preferuje drugie rozwiazanie - w wiekszych projektach moze Ci uratowac zycie :)
// Edit - ofkoz pomijam fakt ze sam delete nie widzi "nc2" - chodzilo mi raczej o ten glebszy problem z wyciekami :)
Pozdr.
st3tc
Użytkownik st3tc edytował ten post 16 lipiec 2005, 19:42
(...) uzycie inteligentnych wskaznikow (np shared_ptr z boost-a). (...)

St3tc, pytanko: Ty używasz boost::shared_ptr, czy pisałeś własny? Ja w tej chwili używam własnego smart pointera w ramach garbage collectora.

Aktualnie boost-a. W sumie wystarcza mi - zabezpiezenie jest. Nie mialem juz sily/ochoty pisac wlasnych implementacji (odeszla mi przy pisaniu wlasnych kontenerow - z trudem dobilem do performance STLPort-a (ale przegralem w "kilku" testach :) ) i ... odpuscilem sobie - na pocieszenie (siebie) dodam ze rozwalilem w pyl dinkumware ;]).
