• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak to działa ?

VPS Starter Arubacloud
0 głosów
257 wizyt
pytanie zadane 25 lutego 2016 w C i C++ przez Szahid Pasjonat (20,930 p.)

Nierozumiem dlaczego podany program działa xd 

Ma on wyświetlać określoną liczbe liter wpisanego ciągu. Według mnie funkcja lef powinna zwrócić wskaźnik do pustego miejsca w pamięci   ponieważ wskażnik p został stworzony wewnątrz tej funkcji i powinien zniknąć po jej wykonaniu wraz z tym na co wskazuje.Myślałem że pamięć jest zwalniana po wykonaniu się fynkcji Dlaczego tak nie jest ? Program działa a powinien się wywalić xd 

 

#include <iostream>
#include<cstdlib>

using namespace std;

char * lef(const char *str,int n=3)
{
char * p=new char [n+1];
int i;
for( i=0;i<n;i++)
{
    p[i]=str[i];
}
p[i+1]='\n';
return p;

}

int main()
{
 char sample[50] ;
 cin.get(sample,50);

 char* ps=lef(sample);

 cout<<ps;

    return 0;

}

 

2 odpowiedzi

+2 głosów
odpowiedź 25 lutego 2016 przez Radfler VIP (101,030 p.)
wybrane 25 lutego 2016 przez Szahid
 
Najlepsza

Nie, pamięć alokowana dynamicznie jest dostępna dopóki nie zostanie zwolniona, a może to odbyć się w dowolnym momencie działania programu. Zwracany wskaźnik cały czas wskazuje na prawidłowy obiekt. Jedyny błąd w tym programie to brak zwolnienia pamięci (delete).

komentarz 25 lutego 2016 przez Szahid Pasjonat (20,930 p.)
Czyli zmienne, struktury lub obiekty tworzone w programie znikają a pamięć alokowana dynamicznie zostaje?
komentarz 25 lutego 2016 przez Radfler VIP (101,030 p.)
W sensie? Na koniec programu i tak cała (nawet dynamiczna) pamięć zostaje zwolniona.
komentarz 25 lutego 2016 przez Szahid Pasjonat (20,930 p.)
W sensie na koniec wykonywania danej funkcji
komentarz 25 lutego 2016 przez Radfler VIP (101,030 p.)
To tak, na koniec wykonania funkcji zostanie zwolniona cała pamięć poza tą dynamiczną.
0 głosów
odpowiedź 25 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Pozwolę się wtrącić jako osoba, która niedawno przechodziła podobny problem. Podczas programu dynamicznie alokujesz pamięć. Ta pamięć zostaje do momentu kiedy poprzez funkcję delete ją usuniesz. Wtedy pozostaje tylko wskaźnik, który wskazywał na to miejsce, gdzie dynamicznie lokowałeś i możesz np kolejny raz zalokować dynamicznie na ten wskaźnik (przynajmniej kiedy ja tak robiłem to program się nie sypał).
komentarz 25 lutego 2016 przez Szahid Pasjonat (20,930 p.)
Dzięki  (12 znaków)
komentarz 26 lutego 2016 przez draghan VIP (106,230 p.)

poprzez funkcję delete ją usuniesz. Wtedy pozostaje tylko wskaźnik, który wskazywał na to miejsce, gdzie dynamicznie lokowałeś i możesz np kolejny raz zalokować dynamicznie na ten wskaźnik (przynajmniej kiedy ja tak robiłem to program się nie sypał).

Jeśli zwolniłeś poprzednio alokowaną pamięć, to możesz potem bez obaw ponownie użyć wskaźnika. On w sumie przechowuje tylko adres (i info o typie, jak każda inna zmienna), a adres na zaalokowaną pamięć dostajesz od OSu każdorazowo po poproszeniu przez new[] i to, co z nim zrobisz, zależy tylko od Ciebie. ;) Oczywiście najrozsądniej go używać, jak bitowa bozia przykazała.

I delete to operator, nie funkcja. ;)

komentarz 26 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Napisałem, że funkcja tylko zjadłem nawiasy ;)
komentarz 26 lutego 2016 przez draghan VIP (106,230 p.)
Widzę. No to Ci mówię, że delete to jest operator, a nie funkcja. ;)
komentarz 26 lutego 2016 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Oj przepraszam. Przez zmęczeniu i brak snu nie tozumiałem co pisałem oraz co mi mówiłeś ;)
komentarz 26 lutego 2016 przez draghan VIP (106,230 p.)
Nie no, nie przejmuj się. :D To nie jest takie ważne, w końcu operator jest swego rodzaju funkcją. ;)

Miłego dnia. :)

Podobne pytania

0 głosów
2 odpowiedzi 243 wizyt
0 głosów
0 odpowiedzi 486 wizyt
pytanie zadane 11 listopada 2019 w C i C++ przez CleaverMan Nowicjusz (140 p.)
0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 6 marca 2019 w C i C++ przez dziubi21 Początkujący (310 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...