Ale pakuję do listy dane o rozmiarze większym niż wskaźnik, stąd pytam;
ansistring
to wskaźnik na tablicę dynamiczną. Więc to ma taki sam rozmiar jak pointer. z kolei shortstring
nie przeszedłby, bo to jest sama tablica.
No dobra, a jeśli wpakuję łańcuch o sporej długości (w każdym razie większej niż 4 bajty) to nie trzeba go wykasować?
Trzeba, tylko że zajmie się tym Delphi które po wykryciu że twój łańcuch jest nieużywany zwolni jego pamięć.
lista w pętli próbuje wywołać destruktor obiektów na liscie, a łańcuch go nie posiada
Ściślej, TObjectList usiłuje potraktować tablicę dynamiczną jako TObject.
jeśli jednak ustawię OwnsObject na False to lista nie zostanie automatycznie zwolniona, stąd pytam
Lista zostanie automatycznie zwolniona, jednak nie będzie wywoływany destruktor obiektów które podałeś (bo to nawet nie muszą być obiekty tak jak słusznie zauważył i zrobił @abrakadaber ).
Ogólnie to chodzi mi o to, czy jak dodam np. jeden element do listy - łańcuch o wadze np. 1kB - i po usunięciu obiektu (bez OwnsObject) czy pamięć po łańcuchu (ten 1kB) zostanie zwolniona; Nie mam narzędzi do MemLeak'ów więc pytam;
Nie, nie zostanie zwolnione po usunięciu obiektu (TObjectList?) tylko po tym, gdy referencje stringa spadną do zera, więc najprawdopodobniej po przypisaniu do s
pustego stringa. Wobec tego mechanizm ten jest niebezpieczny.
string (tak jak i tablica dynamiczna) w delphi jest typem specyficznym, który niejako "sam się zwalnia". Nie trzeba go zwalniać.
Tak samo jak i obiekt (nie klasa). Nie widzę w tym nic 'specyficznego', po prostu niektórzy nie wiedzą czym się ich język różni od takiego C. Niewiedza szkodzi, co widać dobitnie.
Typ PChar
oczywiście przejdzie, ale mi chodziło o wpakowanie zmiennej typu String
; To jednak nie zmienia faktu, że rzutowaniem załatwi się sprawę;
Każdy ansistring jest rozszerzonym PCharem.
@furious programming, http://www.freepascal.org/docs-html/ref/refsu10.html coś dla ciebie (to domyślne stringi od Delphi4 bodaj).
Należy jednak zauważyć że takie rozwiązanie wymaga dużego castowania i generalnie bezpieczniej i czytelniej jest zrobić klasę na string. Takie niebezpieczne castowanie zostawmy dla osób które wiedzą jak działa Delphi/FPC, bo widać tutaj to mniejszość.