przydzielanie pamięci
Ostatnio zmodyfikowano 2011-05-08 22:50
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? |
|
pekfos |
» 2011-05-05 17:17:40 wskaźnik nigdy sam nie tworzy obiektu tylko wskazuje na jakiś. |
|
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; |
|
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ć.
str * nowy, * i; nowy = new str; nowy->v = 123; i = root; while( i->obj != NULL ) { i = i->obj; }
i->obj = nowy;
nowy = 0;
E: Zrobiłem błąd próbując na siłę upraszczać. |
|
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. |
|
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? |
|
absflg |
» 2011-05-05 21:51:34 To nie OBIEKT tylko ADRES obiektu.
Tu przypisałem mu ADRES tego samego obiektu, na który wskazuje wskaźnik root. |
|
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? |
|
« 1 » 2 |