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: #define rozmiar 10
struct Przyklad { int a; Przyklad * nowy[ rozmiar ]; };
class Klasa { przyklad * tmp; Klasa(); ~Klasa(); };
Klasa::Klasa() { tmp = NULL; };
Klasa::~Klasa() { };
int main() { Klasa kolor; }
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 :) |
|
darko202 |
» 2017-04-21 15:00:54 |
|
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: void Klasa::kolejny() { przyklad * rezerwuj = tmp; }
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? |
|
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: a zwalnia jakoś tak: |
|
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: void Klasa::kolejny() { przyklad * rezerwuj = tmp; if( tmp->tab[ i ] != NULL ) tmp->tab[ i ] = new Przyklad(); }
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ć? ;> |
|
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. |
|
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. 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..? |
|
« 1 » |