Skocz do zawartości

walk z ceplusplusem ciąg dalszy - lamerskie pytania 3


Jaklub

Rekomendowane odpowiedzi

EDIT: sory, zamiast odpowiedzi dalem edit wybacz jaklub :D

ciapciak psyś ;p

 

zamiast:

jakasklasa obj[128];

daj:

jakasklasa* obj[128];

bo w metodzie stworzenie masz new a new zwraca wskaznik - new to c++owa ulepszona malloc

 

a tu:

void poteznaklasa::stworzenie() {
int i;
for(i=0; i<128; i++) { // bylo 64 a tablicama 128 elementow przeciez
  obj[i]=new jakasklasa;
  }
}

 

no i lepiej trzymaj to w kontenerze typu vector / lista

 

jaklub: ejj zedytowałeś mojego posta ;p

gwiazdki zapomniałem wstawić do posta, w kodzie była i dlatego wszystko się kompilowało.

głównie chcę się dowiedzieć, czy dobrze usuwam to wszystko z pamięci. pętla była do 64 na zasadzie "bo tak", w moim tworze nie wszystkie elementy tablicy mają być zapełnione (ma być "elastyczny")

Odnośnik do komentarza
Udostępnij na innych stronach

sorki jaklub, omylkowo dalem edit zamiast odpowiedzi ;p

btw. daj kod z usuwaniem

Odnośnik do komentarza
Udostępnij na innych stronach

przypomnę kod:

class jakasklasa {
      // jakies dane
};
class poteznaklasa {
      private:
              jakasklasa *obj[128];
      public:
             void stworzenie();
             void koniec();
};
poteznaklasa instancja;

void poteznaklasa::stworzenie() {
int i;
for(i=0; i<64; i++) { // wiem, ze moze byc 128
  obj[i]=new jakasklasa;
  }
}
void poteznaklasa::koniec() {
int i;
for(i=63; i>=0; i--) {
  delete obj[i];
  }
}

goal: chcę wiedzieć, czy dobrze dodaję i usuwam z pamięci obiekty

przepisane z pamięci, mogą być byki. vector zostanie użyty gdzie indziej

 

dzięki za dotychczasową pomoc =p

 

edit: poprawki

Odnośnik do komentarza
Udostępnij na innych stronach

Ewentualnie możesz pobawić się przeładowaniem operatora delete

po co? Dla dodatkowego spr pointera?

 

 

goal: chcę wiedzieć, czy dobrze dodaję i usuwam z pamięci obiekty

przepisane z pamięci, mogą być byki. vector zostanie użyty gdzie indziej

Teoretycznie tak. Powinieneś jednak :

A) Zerować cała tablice w konstruktorze.

B ) Zwalniać pamięć ze sterty w destruktorze

 

czyli:

 

class Test
{
public:
Test()
{

  for(int i=0;i<128;i++)
{
  m_array[i]=NULL;
}

}


~Test()
{
   for(int i=0;i<128;i++)
{
if(m_array[i]!=NULL)//edit: byl blad zabraklo spr odp elementu
  delete m_array[i];
}

}

void init()
{
    for(int i=0;i<64;i++)
{
   m_array[i]=new jakasklasa();
}
}


private:
jakasklasa* m_array[128];
};

 

 

Dzięki temu unikniesz głupich leaków i przy usuwanie Test:

Test * t=new Test();

t->init();

delete t;

t=NULL;

 

nawet jeśli zapomnisz o init all będzie ok. Jeśli będziesz tworzyć obiekt Test na stosie też będzie ok po wyjściu z range'a destruktor sam usunie co trzeba.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...