| 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 » |