ďťż

Ładny brzuch

Czy jeśli w progsie zadeklaruję np. wskaźnik do int, a później zrobię se np. tablicę,
to czy komp sam posprząta, czy muszę to KONIECZNIE zrobić?



cytat:gokudbz napisał:

Czy jeśli w progsie zadeklaruję np. wskaźnik do int, a później zrobię se np. tablicę,
to czy komp sam posprząta, czy muszę to KONIECZNIE zrobić?

Dobry program powinien po sobie posprzątać. Ale prawda jest taka, że windowsowi zapcha się pamięć, a linux sobie sam posprząta po zakończeniu działania:)

Kodie

w czasie działania programu NIE posprząta

ale zamykając program Windows zwalnia całą pamięć zajmowaną przez program, więc nie musisz się obawiać, że po zamknięciu programu coś zostanie

jednak pamięć musisz zwalniać, bo w czasie działania programu będzie ona zajęta i program bez potrzeby bedzie zajmował zasoby

możesz sam skasować zaalokowaną pamięć operatorem delete, chociaż dużo bezpieczniej jest posługiwać się inteligentnym wskaźnikiem

zasada działania takiego wskaźnika jest banalna, jest to zwykły obiekt, który w destruktorze wywołuje delete

włączając do programu nagłówek <memory> dostaniesz standardowy szablon std::auto_ptr<class T>

jednak ostrzegam - on do zwalniania pamięci używa delete, a nie delete [], a to ogromna różnica!

pozatym operator = powoduje przeniesienie własności z jedngo wskaźnika na drugi czyli:

auto_ptr<int> smptr1;
auto_ptr<int> smptr2;

smptr1.reset(new int);
smptr2 = smptr1;

od tej pory to smptr2 wskazuje na zaalokowaną zmienna, a nie smptr1!

więc wywołanie:
*smptr1 = 5; // spowoduje błąd zapisu pod adresem NULL

dlatego polecam napisanie kilku własnych klas takich wskaźników

dobry system operacyjny powinien sobie z tym poradzic chociaz nie zawsze tak jest :P
w kazdym razie dla mnie jest to przestepstwem :P i nie szanuje zbytnio takich pseudo-programistow.
jesli masz problemy z logicznym rozmieszczeniem konstrukcji new/delete albo zapominasz o zwalnianiu pamieci to moze przerzuc sie na std::vector? przynajmniej czegos nowego sie nauczysz :chytry:

pozdrawiam
pepsi^no1



Jeżeli chodzi ci czy:
int *tab; tab = new int[10]; delete tab;
To według ISO C++ to TAK trzeba to zrobić (chociaż wątpie, żeby od tablicy komuś się komp zawiesił... :cheesy: )

I am the REAL Noname
Moja strona: www.coderulers.prv.pl

Napisz dokładniej o co ci chodzi :) Zrozumiałem że tworzysz wskaznik na int dynamicznie, dalej ... nie wiem o co ci chodzi. :)

Real_Noname znajdz mi fragment gdzie wg ISO C++ trzeba tak robic...
powinno byc:
int *tab;
tab = new int[10];
delete[] tab;
bo twoj kod zwalnia tylko 4 z 40 zaalokowanych bajtow.

pozdrawiam
pepsi^no1

cytat:pepsi napisał:

Real_Noname znajdz mi fragment gdzie wg ISO C++ trzeba tak robic...
powinno byc:
int *tab;
tab = new int[10];
delete[] tab;
bo twoj kod zwalnia tylko 4 z 40 zaalokowanych bajtow.

pozdrawiam
pepsi^no1

No tak :cheesy: dzięki za uwagę Pepsi, pisałem z pamięci i zapomniałem to zrobić (rzadko robie tablice zmiennych int do wskaźnika, lepiej po prostu stworzyć samą zmienną). Co do dyskusji, to lepiej ZAWSZE sprzątać po sobie, jak coś jest niepotrzebne.

I am the REAL Noname
Moja strona: www.coderulers.prv.pl

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •