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

Zwalnianie pamięci struktury odwołującej soię od samej siebie

Ostatnio zmodyfikowano 2017-04-21 22:42
Autor Wiadomość
Anim
Temat założony przez niniejszego użytkownika
Zwalnianie pamięci struktury odwołującej soię od samej siebie
» 2017-04-21 12:37:51
Cześć,

tym razem mam problem ze zwalnianiem pamięci w przypadku, gdy w strukturze odwołuję się do siebie samej. Jak zwolnić i posprzątać pamięć, gdy mam coś tkaiego:


C/C++
#define rozmiar 10

struct Przyklad
{
    int a;
    Przyklad * nowy[ rozmiar ];
};

class Klasa
{
    przyklad * tmp;
   
    /* JAKIES METODY*/
   
    Klasa();
    ~Klasa();
};

Klasa::Klasa()
{
    tmp = NULL;
};

Klasa::~Klasa()
{
    /*Tuataj mam problem*/
};

int main()
{
    Klasa kolor;
   
    /*Wywoływanie metod na rzecz obiektu 'kolor', w których wielokrotnie tworzę kolejne obiekty struktury Przyklad*/
}


Czy w destruktorze wystarczy wywołać 'delete tmp' lub 'tmp = NULL' ? Bo co z kolejnymi tworzonymi obiektami struktury Przyklad (odwołaniami do samej siebie)? Mam nadzieje, że wyrażam się w miarę jasno o co mi chodzi :)
Z góry dziękuję za pomoc :)
P-160324
darko202
» 2017-04-21 15:00:54
zwalnianie pamięci jest konieczne gdy rezerwujesz gdzieś pamięć na zmienną (deklaracja zmiennej tym nie jest), a w zaprezentowanym kodzie tego nie ma - dlatego nie ma co robić :)

opisane jest to  np.
https://pl.wikibooks.org/wiki​/C%2B%2B​/Zarz%C4%85dzanie_pami%C4%99ci%C4%85

http://www.bing.com/search​?q=c%2B%2B+rezerwacja+pami%C4%9​9ci+na+zmienn%C4%85%5C​&src=IE-SearchBox&FORM=IENTSR


P-160330
Anim
Temat założony przez niniejszego użytkownika
» 2017-04-21 15:19:56
Hm... jesteś pewien?

Przecież w Klasie mam odwołanie wskaźnikowe do struktury, która odwołuje się sama do siebie. Dodatkowo mam metody, które wywołują i rezerwują nową pamięć wielokrotnie.

Chociażby jakbym zrobił tak:

C/C++
void Klasa::kolejny()
{
    przyklad * rezerwuj = tmp; //<- pamięc dynamicza
   
    //oczywiscie to nie jest koniec metody
   
}

wywołam teraz tę funkcję kilka razy (na przyklad rekurencyjnie), więc mam wskaźniki pokazujące na różne miejsca w pamięci.

Valgrind nie może się mylić, że nie została zwolniona pamięć w takim przypadku :) Przykład ten, który pokazuję jest w pewien sposób schematem drzewa (w efekcie ma być drzewem :) ).


to znaczy ja rozumiem, że to nie jest wyciek pamięci, ale nadal jest to zajmowana, nie zwolniona pamięć, prawda?
P-160331
wojownik266
» 2017-04-21 15:34:49
Żeby za alokować pamięć na jakąś zmienną to wydaje mi się że robi się to mniej więcej tak:
C/C++
int * a = new int( 10 );

a zwalnia jakoś tak:
C/C++
delete a;

P-160332
Anim
Temat założony przez niniejszego użytkownika
» 2017-04-21 15:48:31
Oczywiście w powyższym przykładzie miało być z new. dokładnie wygląda u mnie ot tak:

C/C++
void Klasa::kolejny()
{
    przyklad * rezerwuj = tmp; //<- pamięc dynamicza
   
    //cos tam
   
    if( tmp->tab[ i ] != NULL )
         tmp->tab[ i ] = new Przyklad();
   
    //oczywiscie to nie jest koniec metody
   
}

i problemem jest to, że muszę tę pamięć trzymać do końca dizałania programu, nie zwalniam jej na bieżąco, a na końcu nie wiem jaki napisać destruktor :) i czy jest na pewno potrzebny, co zasugerował @darko202.

Valgrind wprawdzie nie zgłasza jako takich memory leak, ale wypisuje 'Still reachable'. Czy należy się tym przejmować? ;>
P-160333
Chowan
» 2017-04-21 16:10:34
nie jestem pewien ale wydaje mi sie, że nie alokujesz pamięci dynamicznie a jedynie przypisuje cos? wskaznikowi czego chyba się nie robi.
P-160335
pekfos
» 2017-04-21 22:42:32
Dopisz do Przyklad konstruktor, który wyzeruje wskaźniki i destruktor, który wywoła delete na wszystkich. Nie musisz sprawdzać, czy wskaźnik jest pusty. Nie trzeba nic więcej, o ile Przyklad to drzewo.

C/C++
if( tmp->tab[ i ] != NULL )
     tmp->tab[ i ] = new Przyklad();
Tracisz informację o pamięci wskazywanej przez nadpisywany wskaźnik. Jeśli to jedyne odwołanie, to wycieknie ci pamięć. Może powinieneś użyć wskaźników inteligentnych..?
P-160341
« 1 »
  Strona 1 z 1