Przypisywanie wskaźników do wskaźników i ich żywotność.

Odpowiedz Nowy wątek
2011-08-11 18:59
jaor
0

Witam,
mam pytanie dotyczące żywotności wskaźników.
Załóżmy że:

void klasa::metoda(innaKlasa *ptr)
{
    jeszczeInnaKlasa *wsk;
    wsk = ptr->getJeszczeInnaKlasa();
   //klasa zawiera np. wektor QVector<jeszczeInnaKlasa*>
    wektor.push_back(wsk);
}
 

oraz:

class innaKlasa
{
(...)
    QVector<jeszczeInnaKlasa> jeszczeInne;
(...)
    jeszczeInnaKlasa* getJeszczeInnaKlasa()
        {
             return &jeszczeInne.last();
        };
};

O ile dobrze rozumiem, to teraz w jakiejś metodzie klasy klasa mogę przeprowadzić zmiany na obiekcie wskazywanym przez jeszczeInnaKlasa a efekt przeniesie się na zawartość wektora w innaKlasa ?
[QVector to coś a'la STL-owy vector, tyle że z frameworku Qt.]
Pytam, ponieważ męczę się z projektem, w którym mam wiele klas z wektorami wskaźników w stylu wyżej wymienionej klasa i z tego co mi pokazuje debugger wskaźnik kończy życie po wyjściu z metody :/ [wskaźnik np. taki jak w pierwszym kodzie : jeszczeInnaKlasa wsk*].
Byłbym wdzięczny za kilka słów wyjaśnienia odnośnie wskaźników, które ogółem są mi znane, ale jak przychodzi do tego, że klasa 1 ma w sobie wskaźniki na klasę 2 a ta ma w sobie wskaźniki na inne obiekty klasy 2, która to z kolei klasa ma w sobie wskaźnik na klasę 3, to trudno jest wychwycić, gdzie to wszystko się gubi. Tym bardziej, że większość tych wskaźników jest przechowywana w wektorach (QVector), które są pozbawiane pewnych elementów, tudzież zwiększane o jakieś elementy. Popełniam pewnie gdzieś jakiś trywialny błąd, ale nie potrafię wyłapać jaki.
Aktualny problem mam z tym, że klasa ma w sobie listę wskaźników na klasa2, a ten z kolei ma wskaźnik na klasa [coś w stylu by rodzic znał swe dzieci, a dzieci rodzica] i w momencie gdy obiekt klasa2 zmienia rodzica [w obrębie tej samej klasy] to po przypisaniu mu wskaźnika na nowego rodzica, po wyjściu z funkcji przypisującej rodzica rodzic ten jest jakby gubiony, tak jak zmienna lokalna po wyjściu z obrębu swego 'rejonu działania'.
Z góry dziękuję za pomoc.

Pozostało 580 znaków

2011-08-11 19:38
0

Cóż,zatem imo to źle zaprojektowany program jest.
Co zaś do wskaźników w QVectorze-przy dodawaniu doń czegoś robiona jest kopia elementu i to ona jest w nim przechowywana,tak więc wyjście z zakresu ważności zdeklarowanego wskaźnika "nie robi".Za to jak słusznie zauważyłeś,może robić różnicę parentowanie obiektów-wiadomo,jak parenta ktoś potraktuje deletem to jego childy ten sam los spotka.

Sugeruję,o ile Twoje klasy przechowywane w wektorach dziedziczą po QObject,zamiast wektorów wskaźników używać QVector<QPointer<twojaklasa> >.QPointer automatycznie się zeruje kiedy QObject na który wskazuje spotka delete,więc łatwo ustrzeżesz się dzięki temu przed próbami odwołań do takiego skasowanego obiektu


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-08-11 20:10
jaor
0

Dzięki za odpowiedź.
Sęk w tym, że na razie delete spotkany nie był, bo nie były kasowane obiekty,tylko wskaźniki na nie.
Problem polega najprawdopodobniej na tym (właśnie chyba znalazłem..), że QVector podczas push_back-a jest realokowany, czyli wszystkie wskaźniki do elementów wskazują na coś innego aniżeli mogłoby się wydawać. Próbuję aktualnie z QList, bo niejakoby, wskaźniki do elementów mają zawsze być stałe niezależnie od realokacji.

A co do projektu programu, to potrzebuję przechowywać w wielu obiektach wiele odwołań do stałych elementów. Jeśli coś się w tym elemencie zmienia to nie chcę aktualizować każdego elementu w stu instancjach, po to mi wskaźnik. Trochę jak przechowywanie informacji o grafach. Jeśli w węźle zmieni się jedna z wartości, to nie chcę w każdej klasie, która posiada w sobie ten węzeł zmieniać tej wartości. Lepiej w klasie przechowywać wskaźnik do tego węzła. Nieprawdaż? ;)

zdaje się że vector i Qvector też, podczas realokacji robią kopię tego co już mają więc wskaźniki wskazują cały czas na to samo (inaczej nie miałoby to sensu) - yet_another_bug 2011-08-11 22:56

Pozostało 580 znaków

2011-08-11 20:23
0
jaor napisał(a)

Sęk w tym, że na razie delete spotkany nie był, bo nie były kasowane obiekty,tylko wskaźniki na nie.

Zapodaj kod,który to robi.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0