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

Zwalnianie pamięci

Ostatnio zmodyfikowano 2010-04-23 00:06
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
Zwalnianie pamięci
» 2010-04-22 21:09:06
witam.

mam wektor na wskazniki do swojej klasy std::vector<class*> wektor, po nacisnieciu spacji
C/C++
if( key[ KEY_SPACE ] ) class * nowy = new class( x, y )
laduje do nowego obiektu bitmape, ustalam jakies wartosci itd, wrzucam do wektora przez push_back, a po spelnieniu okreslonego warunku usuwam przez
C/C++
delete wektor[ i ]
//...
wektor.erase[ tab.begin() + i ]
, czy to wystarczy na posprzatanie obiektu? czy musze jeszcze dodatkowo usunac bitmape?
P-16306
WunM
» 2010-04-22 21:44:13
Stwórz sobie klasę:

C/C++
class AAA {
   
public:
    AAA() { std::cout << "constructor" << std::endl; }
    ~AAA() { std::cout << "destructor" << std::endl; }
};

I porównaj to:

C/C++
AAA * aaa = new AAA;

std::vector < AAA > bbb;
bbb.push_back( * aaa );

z tym:

C/C++
AAA * aaa = new AAA;

std::vector < AAA *> bbb;
bbb.push_back( aaa );
//delete aaa;

Wnioski wyciągnij sam. Aha i znajdź memleaka.
P-16307
dmx81
Temat założony przez niniejszego użytkownika
» 2010-04-23 00:06:34
C/C++
std::vector < C_poziom1 > vTablicaObiektow;
C_poziom1 cPodloga;
cPodloga.i_x = 10;
cPodloga.i_y = 10;
//...
vTablicaObiektow.push_back( cPodloga );

C/C++
std::vector < C_poziom1 *> vTablicaWskaznikow;
C_poziom1 * cPodloga = new C_poziom1;
cPodloga->i_x = 10;
cPodloga->i_y = 10;
//...
vTablicaWskaznikow.push_back( cPodloga );

taki dostalem wzor na tym forum, na obiekty i na wskazniki.


co do twojej podpowiedzi,
przypadek pierwszy - wywolywany jest konstruktor i destruktor, nie wiem dlaczego 2 x wiecej destruktorow niz konstuktorow i czemu nie kolejno (kon, kon, des, kon, des, des, des, des - cos takiego, new po wcisnieciu spacji)

drugi przypadek, tylko konstruktor -

nie uzywam w zadnym z tych przypadkow delete ani nic takiego, bede teraz dalej analizowal co i jak


a do tej pory to ja to rozumiem jako:

C/C++
class * wskaznik = new class; //tu tworze wskaznik, poprzez ktory powstaje nowy obiekt klasy (instancja)
std::vector < class *> wektor_wskaznikow; //tu tworze wektor, ktory bedzie przechowywal te wskazniki(wskazniki te wskazuja na adres w pamieci, na nowo utworzona instancje mojej klasy)

wektor_wskaznikow.push_back( wskaznik ); //tutaj do wektora wrzucam wskazniki do kolejno nowo tworzonych instancji, czyli wektor_wskaznikow[n] wskazuje na n-ty utworzony obiekt

delete wektor_wskaznikow[ n ]; // usuwam n-ty obiekt(instancje)
wektor_wskaznikow.erase( wektor_wskaznikow.begin() + n ) // usuwam z wektora wskaznik, bo wskazywalby na usuniety obiekt)
 nie wiem czy robie cos zle?
wydaje mi sie, ze robie dobrze, bo jesli dam tylko delete, to przy probie odwolania sie do tego elementu w wektorze, program mi sie wysypuje, czyli raczej usuniety ten obiekt no nie? no to pozniej tylko usuwam "pusty" wskaznik z wektora i chyba czysto?


P-16309
« 1 »
  Strona 1 z 1