Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

przydzielanie pamięci

Ostatnio zmodyfikowano 2011-05-08 22:50
Autor Wiadomość
markon
Temat założony przez niniejszego użytkownika
przydzielanie pamięci
» 2011-05-05 17:13:15
witam,
nie mam pojęcia kiedy muszę przydzielać pamięć a kiedy nie,
powiedzmy że mam klasę / strukturę
struct str {
int v;
struct str *obj;

}*str; // wskaźnik typu tej struktury  - czy ma on juz przydzieloną pamiec

ale nie na tym polega mój główny problem, jest w funkcji main
struct str *wsk; // murze teraz przydzielać pamięć? wsk = new str;
wsk->v = 5; //czasem jeśli nie przydzielę pamięć to program zostaje zamknięty, ale czasem nie, wiec nie wiem w końcu jak to jest,

obj-> value = 5; //czy moge w ten sposób uzywac obiektu tworzonego tam przy strukturze?
P-32692
pekfos
» 2011-05-05 17:17:40
wskaźnik nigdy sam nie tworzy obiektu tylko wskazuje na jakiś.
P-32694
markon
Temat założony przez niniejszego użytkownika
» 2011-05-05 20:34:17
zgadza się, rzeczywiście źle się wyraziłem, ale operator new przydziela pamięć i dlaczego czasem muszę go użyć a czasem nie,
może inaczej kiedy jeśli tworzę obiekt swojej klasy / struktury powinienem użyć operatora(bez znaczenia czy mam napisany konstruktor czy nie)
i jak to jest z obiektami tworzonymi w końcu struktury czyli }*root;
P-32712
absflg
» 2011-05-05 20:41:23
Poprawka: to nie obiekt, tylko wskaźnik na obiekt. Niczym nie różni się od napisania
str * root;
 już poza definicją klasy. Jest to po prostu zapis skrócony. Głównie do tworzenie obiektów klas bez nadawania nazwy tej klasie.

struct str * obj;
? Chyba raczej
str * obj;
. Słowo kluczowe struct poprzedza tylko definicje i deklaracje klas. Nie jest elementem ich nazwy.
I nie jakim cudem chcesz utworzyć wskaźnik str na obiekt klasy str? Nazwa się przecież powtarza...

wsk->v = 5; //czasem jeśli nie przydzielę pamięć to program zostaje zamknięty, ale czasem nie, wiec nie wiem w końcu jak to jest,
 To ja cię uświadomię. Przydzielanie pamięci musi następować gdy używamy wskaźnika, któremu nie została przydzielona jeszcze pamięć. I tyle.

Twoja struktura to stos lub kolejka jak widzę (a raczej jej element). Na początku masz wskaźnik na pierwszy element. Musisz mu przydzielić pamięć. Następnie żeby coś dodać musisz przydzielić pamięć dalej.
root->obj = new str;

Jeżeli obiekt ma już przydzieloną pamięć to nie musisz tego robić.
C/C++
str * nowy, * i;
nowy = new str;
nowy->v = 123;
i = root; //iterator
while( i->obj != NULL ) { i = i->obj; } //jeżeli dalej coś jest to przejdź do następnego

i->obj = nowy; //NIE PRZYDZIELAMY PAMIĘCI
//ten obiekt ma już przydzieloną pamięć.

nowy = 0; //I nic. Obiekt nadal jest na końcu kolejki, bo wyzerowałem tylko jego ADRES zapisany w zmiennej nowy

E: Zrobiłem błąd próbując na siłę upraszczać.
P-32713
michalp
» 2011-05-05 21:04:20
Słowo kluczowe struct poprzedza tylko definicje i deklaracje klas. Nie jest elementem ich nazwy.

Nie prawda. W C jest to wymagane (chyba że użyło się typedef), w C++ możliwe ale nie konieczne.
P-32714
markon
Temat założony przez niniejszego użytkownika
» 2011-05-05 21:06:37
w którym miejscu przydzieliłeś pamięć dla iteratora i?
P-32715
absflg
» 2011-05-05 21:51:34
To nie OBIEKT tylko ADRES obiektu.
C/C++
i = root;
Tu przypisałem mu ADRES tego samego obiektu, na który wskazuje wskaźnik root.
P-32716
markon
Temat założony przez niniejszego użytkownika
» 2011-05-07 11:18:28
w takim razie po co czasem należy przydzielać pamięć jeśli mamy do czynienia ze wskaźnikiem a nie obiektem?
P-32779
« 1 » 2
  Strona 1 z 2 Następna strona