zmienna obiektowa po destruktorze - jak wykryć?

0

Witam.
Czy jest mozliwość stwierdzenia czy pod zmianną obiektu jest poprawny obiekt? to znaczy czy ne został usunięty?
Chodzi mi o sytuacje nastepujacą:

var a:jakasklasa;
begin
a:=jakasklasa.create.
...
a.free;
...
a.metoda //tu "a" nie musi byc nil ale wywolanie spowoduje access violation. Jak to wykryc?

Oczywiście mozna zawsze starac sie dbac że jesli zwalnia sie pamiec obiektu to jego zmiennej przypisuje sie nil ale to nie takie proste kiedy korzysta sie z wielu zmiennych wskazujacych ten sam obiekt , stąd moje pytanie.

0

jeśli nie jest równa nil to nie ma możliwości stwierdzić czy wskazuje na poprawny obiekt czy nie
BTW co to za aplikacja, która wymaga wielu wskaźników do jednego obiektu???

0

Używaj, o ile możesz, FreeAndNil.

0

Dzięki za odpowiedzi.

Ja się oczywiscie zawsze staram przypisywac zmiennym nil jesli zwalniam ich pamiec, to jasne. Jednak zwolnic pamiec mozna tylko raz i freeandnil rowniez generuje access violation przy ponownej próbie zwalniania pamieci jesli obiekt nie jest nilem a pamięć była juz zwolniona.
Akurat kończę pisac dwie klasy ktore są odpowiedzialne za zarządzanie danymi na dysku. Stąd oczywiscie żeby nie było galimatiasu zawsze jeden obiekt odpowiada za okreslona grupe danych dyskowych i w tej sytuacji w roznych miejscach programu będzie potrzeba korzystania z tego samego
obiektu. Teraz chciałbym zabezpieczyc kod przed mozliwymi bledami podczas dzialania programu w ktorym bede go wykorzystywal. Trudno wykluczyc, że cos sie gdzies niedobrego nie wydarzy dlatego chcialbym moc rozpoznawac czy pod zmienna obiektowa kryje sie obiekt czy tez pamiec moze zostala
gdzies zwolniona a nil zmiennej nie został przypisany. Podejrzewam ze mozliwoisc stwierdzania takich nieporzadanych sytuacji jednak jest.
Wskazówką może tu byc chocby menadzer pamieci fastmm4(jest do ściagniecia na torry.net), ktory jako jedną ze swych funkcji ma sledzenie czy nie ma wyciekow pamieci a wiec musi miec mapę pamieci wykorzystywanej przez program i wiedziec co i jak skoro potrafi wskazac ze np. obiekt klasy
Tmemorystream zgubil gdzies okreslona ilosc bajtów pamieci. Nie bardzo usmiecha mi się wgłębianie się w kod menadzera pamieci ktory w znacznym stopniu jest assemblerowy. Pomyslalem, że moze ktos sie na tym lepiej zna i wie jak do tego podejsc i stąd ten post i moje pytanie.
W dalszym ciagu czekam na konstruktywne wypowiedzi na ten temat:)

0
Marmar napisał(a)

Jednak zwolnic pamiec mozna tylko raz i freeandnil rowniez generuje access violation przy ponownej próbie zwalniania pamieci jesli obiekt nie jest nilem a pamięć była juz zwolniona.
to nie do końca prawda bo FreeAndNil próbuje zwolnić obiekt TYLKO jeśli jest <> nil

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