Pomoc oko C++

poruka: 48
|
čitano: 9.694
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Re: Pomoc oko C++
1domagoj1 kaže...

Uh, moral buš mi malo bolje pojasniti situaciju jer bojim se da te nisam skužil. Em je kasno, em u glavi imam žurku koju su organizirale jednadžbe ravnina, pravaca, vektori, njihovi svi mogući umnošci i ostatak ekipe {#}.

Dakle static članove strukture možemo shvatiti kao "globalne" varijable za tu strukturu. Postoji samo jedan objekt dotične static varijable i njemu se može pristupiti iz bilo koje članice strukture.

Moj static član je double** D kojem sam alocirao memoriju u jednoj funkciji koja se izvršava na samom početku programa. Želio bih na kraju programa osloboditi tu memoriju. Može li se to napraviti "automatski", kao što se pozivaju destruktori svake od članica klase ili moram pisati funkciju koju stavim prije returna u mainu koja će tu memoriju oslobodit?

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
17 godina
neaktivan
offline
Pomoc oko C++

Ak sam te dobro skužio, ti imaš klasu u kojoj je metoda u kojoj imaš taj statički član klase? E sad, kolko ja znam statički članovi se eksplicitno moraju inicijalizirati izvan klase. Pa bi onda valjda i uništiti ih trebalo izvan klase, u tvom slučaju pred kraj programa. Ako ne, onda će se uništiti nakon izlaska iz main()-a. To je moje skromno mišljenje... Ak neko zna više, nek veli nekaj onda u vezi toga.

Q: a kako se to linux ponasa kad crkne hdd? A: zastekava svakih 60 sec,ali prezivi se
 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Pomoc oko C++
1domagoj1 kaže...

Ak sam te dobro skužio, ti imaš klasu u kojoj je metoda u kojoj imaš taj statički član klase? E sad, kolko ja znam statički članovi se eksplicitno moraju inicijalizirati izvan klase. Pa bi onda valjda i uništiti ih trebalo izvan klase, u tvom slučaju pred kraj programa. Ako ne, onda će se uništiti nakon izlaska iz main()-a. To je moje skromno mišljenje... Ak neko zna više, nek veli nekaj onda u vezi toga.

Ma ne, obična static varijabla, koja jest inicijalizirana van klase (na NULL). Vanjska funkcija na početku maina učitava neke podatke, alocira memoriju za D i puni ju tim podacima. Ma mislim da ću napravit fju koja ju uništi prije returna i bok :D

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
17 godina
neaktivan
offline
Pomoc oko C++

A ne znam, jedino kaj mi još pada na pamet su smart pointeri.

 

http://en.wikipedia.org/wiki/Smart_pointer

 

Ili da enkapsuliraš taj svoj pointer u klasu (kao član). I onda koristiš tu klasu kao tip za taj svoj pointer. Na taj način znaš da će kad aplikacija završi destruktor biti pozvan. Onda samo izbrišeš to čudo u destruktoru. Ako je to uopće izvedivo u tvom slučaju :D, 1:22 je, tak da ono, svakakve mi ideje padaju na pamet.

Q: a kako se to linux ponasa kad crkne hdd? A: zastekava svakih 60 sec,ali prezivi se
 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Pomoc oko C++
Luuka kaže...

Moj static član je double** D kojem sam alocirao memoriju u jednoj funkciji koja se izvršava na samom početku programa. Želio bih na kraju programa osloboditi tu memoriju. Može li se to napraviti "automatski", kao što se pozivaju destruktori svake od članica klase ili moram pisati funkciju koju stavim prije returna u mainu koja će tu memoriju oslobodit?

 

Koliko sam skužio ti želiš da je ta memorija bude alocirana tijekom cijelog trajanja programa. Ako je to slučaj, onda ni ne trebaš oslobodit tu memoriju jer će se pri završetku programa sva memorija ionako oslobodit i vratit OS-u.

15 godina
neaktivan
offline
Re: Pomoc oko C++
1domagoj1 kaže...

A ne znam, jedino kaj mi još pada na pamet su smart pointeri.

 

http://en.wikipedia.org/wiki/Smart_pointer

 

Ili da enkapsuliraš taj svoj pointer u klasu (kao član). I onda koristiš tu klasu kao tip za taj svoj pointer. Na taj način znaš da će kad aplikacija završi destruktor biti pozvan. Onda samo izbrišeš to čudo u destruktoru. Ako je to uopće izvedivo u tvom slučaju :D, 1:22 je, tak da ono, svakakve mi ideje padaju na pamet.

 

Evo jedna dobra implementacija pametnih pointera. 

 

http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/shared_ptr.htm

16 godina
neaktivan
offline
Re: Pomoc oko C++
matej885 kaže...
Luuka kaže...

Moj static član je double** D kojem sam alocirao memoriju u jednoj funkciji koja se izvršava na samom početku programa. Želio bih na kraju programa osloboditi tu memoriju. Može li se to napraviti "automatski", kao što se pozivaju destruktori svake od članica klase ili moram pisati funkciju koju stavim prije returna u mainu koja će tu memoriju oslobodit?

 

Koliko sam skužio ti želiš da je ta memorija bude alocirana tijekom cijelog trajanja programa. Ako je to slučaj, onda ni ne trebaš oslobodit tu memoriju jer će se pri završetku programa sva memorija ionako oslobodit i vratit OS-u.

Smart pointeri nisu ono što mi treba, znam za njih, radio sam s njima više puta. A konzultirao sam se s kolegom i napravit ću funkciju kojom ću dealocirat tu memoriju na završetku programa. Neće se klasa skroz brinut za sebe, al nema veze.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
15 godina
neaktivan
offline
Re: Pomoc oko C++
Luuka kaže...

Smart pointeri nisu ono što mi treba, znam za njih, radio sam s njima više puta. A konzultirao sam se s kolegom i napravit ću funkciju kojom ću dealocirat tu memoriju na završetku programa. Neće se klasa skroz brinut za sebe, al nema veze.

 

Ako je završetak programa, nema potrebe za dealociranjem memorije (osim u nekim specijalnim slučajevima). 

17 godina
neaktivan
offline
Re: Pomoc oko C++
matej885 kaže...
Luuka kaže...

Smart pointeri nisu ono što mi treba, znam za njih, radio sam s njima više puta. A konzultirao sam se s kolegom i napravit ću funkciju kojom ću dealocirat tu memoriju na završetku programa. Neće se klasa skroz brinut za sebe, al nema veze.

 

Ako je završetak programa, nema potrebe za dealociranjem memorije (osim u nekim specijalnim slučajevima). 

Istina, ali to je loša praksa. Ako dozvoliš nekoliko tisuća (ili samo desetaka) leakova, postaje nemoguće razlikovati koji su "namjerni", a koji su stvarne greške. Puno je bolje korektno sve dealocirati.

 

17 godina
moderator
online
Re: Pomoc oko C++
matej885 kaže...
Luuka kaže...

Smart pointeri nisu ono što mi treba, znam za njih, radio sam s njima više puta. A konzultirao sam se s kolegom i napravit ću funkciju kojom ću dealocirat tu memoriju na završetku programa. Neće se klasa skroz brinut za sebe, al nema veze.

 

Ako je završetak programa, nema potrebe za dealociranjem memorije (osim u nekim specijalnim slučajevima). 

To je istina, jer će OS svu memoriju koju je zauzeo program proglasiti slobodnom, međutim program bi uvijek trebao sam dealocirati zauzetu memoriju prije završetka (i uništiti sve alocirane objekte, naravno). Zašto? Između ostalog, zato jer kad ideš proširivati program, možda si računao na to da ne trebaš dealocirati neku memoriju jer program ionako će "sad" završiti, a u dorađenom programu će ta možda memorija visjeti zauzeta, a nekorištena, odnosno možda ti se dogodi curenje memorije.

 

Uglavnom, svakako je dobra praksa dealocirati svu alociranu memoriju. Ako radiš OOP, onda se klase moraju pisati tako da kad objekti kreiraju druge objekte, da ih unište kad ih više ne trebaju, odnosno da ih dealociraju u svom destruktoru (ako se dalje više neće koristiti). Kad si čovjek to tako posloži, onda se zapravo ni ne mora previše brinuti za dealociranje memorije - ako su mu svi objekti ispravno povezani, kad uništi prvi objekt, to će za sobom povući sve ostale - odnosno, cijeli sustav će se takoreći sam dealocirati.

 

 

EDIT: ostala mi ova stranica otvorena dugo vremena u browseru pa nisam vidio DigiMagicov post - on me pretekao. S druge strane, eto, postoje barem dvije osobe koje isto identično razmišljaju o tom problemu.

 

Poruka je uređivana zadnji put uto 22.3.2011 18:56 (mbaksa).
15 godina
neaktivan
offline
Pomoc oko C++

 

Ma naravno da treba izbjegavat bilo kakve leakove, pogotovo kod većih programa.

 

Samo koliko sam ja shvatio Luka na početku programa alocira memoriju i stavi neke podatke u nju. Također koliko sam shvatio više ne mijenja sadržaj toga, samo čita, a static koristi jer tijekom čitavog programa želi u svim instancama klase imat pristup tim podacima, ali bez da zagađuje globalni scope. Ako je to slučaj, mislim da ne treba previše petljat s dealociranje.

 

Ako baš želiš da se memorija automatski dealocira, možeš taj double **d smjestit u neku strukturu/klasu čiji će destructor biti zadužen za oslobađanje memorije, a ta struktura/klasa će biti deklarirana kao static varijabla.

 

struct BlaBla {
   double **d;
   BlaBla() {} // možda pozvanje funkcije za inicijalizaciju d?
   ~BlaBla() {
     // Kod za oslobađanje memorije za d
   }
};
class Nekaj {
     // umjesto double **d
     static BlaBla d;
};
BlaBla Nekaj::d;

 

 
0 0 hvala 0
15 godina
offline
Pomoc oko C++

U c++-u sam dinamički alocirao polje tipa char duljine 30 članova. U njega sam unio x članova(slova). Onda sam dinamički alocirao novo char polje duljine x i u njega putem for petlje prenio članove iz starog polja. Kad želim ispisati članove novog polje, program mi ispiše članove starog polja plus još neke znakove:

 

 

 

#include <iostream>

 

using namespace std;

 

int main()

{

   char *unos=new char[30];

   cin>>unos;

   int x=-1;

   do{

     ++x;

   }while(unos[x]!=0);

   cout<<x<<endl;

   char *ispis=new char[x];

   for(int a=0;a<x;a++){

     ispis[a]=unos[a];

   }

   delete [] unos;

   cout<<ispis<<endl;

   delete [] ispis;

   return 0;

}

 

Primjer ispisa:

Unos: abcd

Ispis: abcd-

Unatoč glupome nadimku kojeg ne mogu promijeniti,ne igram CoD i sl.
 
0 0 hvala 0
17 godina
offline
Pomoc oko C++

Napravi ovako, skužit ćeš gdje je greška:

 

 

#include <iostream>

using namespace std;

 

 

int main()

{

   char *unos=new char[30];

   int x = 0;

   do{

     cin>>unos[x];

     ++x;

   }while(unos[x-1] != '0');

   char *ispis=new char[x];

   for(int a=0;a<x;a++){

    ispis[a]=unos[a];

   }

   delete [] unos;

   for(int i = 0; i< x; ++i)

   {

  cout<< ispis[i];

   }

   delete [] ispis;

   return 0;

}

 

Poruka je uređivana zadnji put sub 2.4.2011 17:34 (Floki).
 
1 0 hvala 1
17 godina
offline
Pomoc oko C++

Ili ako nećeš nulu na kraju:

 

 

 

#include <iostream>

using namespace std;

 

 

int main()

{

   char *unos=new char[30];

   int x = 0;

   do{

     cin>>unos[x];

     ++x;

   }while(unos[x-1] != '0');

   char *ispis=new char[x-1];

   for(int a=0;a<x-1;a++){

    ispis[a]=unos[a];

   }

   delete [] unos;

   for(int i = 0; i< x-1; ++i)

   {

  cout<< ispis[i];

   }

   delete [] ispis;

   return 0;

}

 

 

Poruka je uređivana zadnji put sub 2.4.2011 17:40 (Floki).
 
1 0 hvala 1
17 godina
offline
Pomoc oko C++

Sad slijedi zaključak:

 

 

#include <iostream>

 

using namespace std;

 

int main()

{

   char *unos=new char[30];

   cin>>unos;

   int x=-1;

   do{

    ++x;

   }while(unos[x]!= '\0');

   cout<<x<<endl;

   char *ispis=new char[x+1];

   for(int a=0;a<x;a++){

    ispis[a]=unos[a];

   }

   ispis[x] = '\0';      // dakle trebao si novi niz ograničiti znakom za prekid

   delete [] unos;

   cout<<ispis<<endl;

   delete [] ispis;

   return 0;

}

 

Poruka je uređivana zadnji put sub 2.4.2011 17:53 (Floki).
 
1 0 hvala 1
15 godina
offline
Pomoc oko C++

Hvala @Floki!

 

Ja sam gotovo potpuno zaboravio na taj /0 na kraju u char poljima pa mi je ispisivalo i izvan granica polja. Valjda neću ponoviti takvu glupost više.

Unatoč glupome nadimku kojeg ne mogu promijeniti,ne igram CoD i sl.
 
0 0 hvala 0
17 godina
offline
Re: Pomoc oko C++
captain_soap_McTawish kaže...

Hvala @Floki!

 

Ja sam gotovo potpuno zaboravio na taj /0 na kraju u char poljima pa mi je ispisivalo i izvan granica polja. Valjda neću ponoviti takvu glupost više.

desilo se to svakom živom, u prvom nizu taj znak se automatski stavio jer si ga inicijalizirao, u drugom nije jer si petljom unosio znak po znak

zato su valjda i napisali string klasu da nam olakšaju život{#}

Poruka je uređivana zadnji put sub 2.4.2011 18:26 (Floki).
15 godina
offline
Pomoc oko C++

Može li mi netko dati nekakve primjere gdje se koristi dinamičko programiranje osim knapsack problema? Trebam ga malo utvrditi.

Unatoč glupome nadimku kojeg ne mogu promijeniti,ne igram CoD i sl.
 
0 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice