Access violation - dziwny koniec problemu

0

Mam pewien problem odnośnie Access violation pokazującego się w mojej aplikacji. Przybliżę trochę problem, to może rozwiązanie nie będzie jakieś trudne.
Otóż mam przycisk po kliknięciu, którego usuwam wcześniej utworzone dynamiczne komponenty (Komponent.Free), a potem w tej samej procedurze tworze jakieś inne. Po paru kliknięciach (czasami po pierwszym, czasami po trzecim, piątym - nie wiem co powoduje tę rozbieżność) pojawia się wspomniane już okienko Access violation, program działa dalej i znowu po którymś kliknięciu pokazuje się to okienko. Breakpointy nie pomagają (program wykonuje wszystkie procedury i dopiero potem pokazuje okienko błędu).

Zdesperowany skorzystałem z pakietu FastMM (pierwszy raz z niego korzystam, więc nie wiem, czy dobrze go użyłem), o którym wzmianka była w artykule (z FullDebugMode, raportowaniem itd.). Jakież było moje zdziwienie gdy błąd przestał występować (tylko po dodaniu do uses FastMM4), a program działa tak jak chcę, żaden raport się nie tworzy. Natomiast gdy usunę go z uses problem pojawia się na nowo.

Trochę się zdziwiłem, dlatego chciałem zapytać czy takie działanie jest normalne, i czy może jest jakiś inny sposób by naprawić ten problem (nie za pomocą dodania FastMM4)?

Mam nadzieję, że ktoś przeczytał w całości to co napisałem, :-)
Pozdrawiam

0

No moim zdaniem problem należy naprawić bez używania FastMM. Bo inaczej błąd moze pojawić się gdzieś indziej.

Podejrzewam, że gdzieś możesz mieć wyciek pamięci.
Zobacz, czy faktycznie zawsze zwalniasz obiekt po stworzeniu go.
Zwalniaj obiekty używając FreeAndNil.

Jeśli zmienisz cały kod, powinno być ok.

0

a czym może spowodowane być to, że raz błąd pokazuje się za pierwszym razem, raz za trzecim... nigdy nie wiem za którym ale zwykle nie przekracza 5? po podejrzeniu zmiennych są one takie jak chcę

0

Generalnie sprawa jest dość ciężka to wyśledzenia i wytłumaczenia. Krótko mówiąc czasami próbujesz się dostać do obszaru pamięci, w którym coś niby powinno być, ale nie ma.
Czemu nie ma? To jest właśnie ciężkie do stwierdzenia, zwłaszcza gdy nie widać kodu :)

Po prostu upewnij się, że ZAWSZE zwalniasz obiekt i zwalniaj używając procedury FreeAndNil. Zrób zmiany w CAŁYM programie, a wszystko powinno działać bez FastMM.

FastMM to jest po prostu lepsze zarządzanie pamięci. Dlatego po jego użyciu mogło działać. Oznacza to jednak, że aplikacja jest źle zrobiona i to może doprowadzić do złego działania w przyszłości ;)

0

daj to co robisz w tym przycisku

0

Grossi. Moze przyczyna lezy w zwalnianiu tychże komponentów.
Moze wywolujesz metode Komponent.Free na komponencie, ktory juz nie istnieje?

Zrob tak jak Ci Juhas pisal wczesniej, uzyj FreeAndNil a nastepnie przed zwalnianiem komponentu zrob test:
if Assigned(Komponent) then FreeAndNil(Komponent);

powodzenia

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