funkcja zwraca PAnsiChar tylko czy ten string istnieje po zakończeniu funkcji ?
Patrząc na ten kod, trudno jest powiedzieć, dlatego że menedżer stringów może robić magię. Ten pom.wynik
znajduje się w obiekcie, który zostaje zwolniony na koniec, więc teoretycznie ten string zostaje dealokowany. Teoretycznie, bo linijka tmp1:= AnsiString(pom.wynik)
może inkrementować licznik referencji i wtedy ciąg może istnieć na stercie po zniszczeniu obiektu pom
. Dosyć niebezpieczna ta zabawa, w dodatku abstrakcje w formie menedżera stringów tylko ból głowy wywołują.
Rozsądnie będzie więc przyjąć, że refcount nie wchodzi w grę i po prostu finalizator zwalnia string z pamięci, przez co ta funkcja zwraca wskaźnik na śmieci. Rozwiązaniem może być po prostu ręczna alokacja bloku pamięci na stercie, skopiowanie zawartości ciągu i zwrócenie do niego wskaźnika.
W debugerze możesz zobaczyć co zwróciła funkcja, w jakim formacie itp.
Wiem, że assembler jest fajny, ale trzeba go używać, prawdziwy programista się nie boi debugować w assemblerze, jak dodasz symbole debuggera to będziesz mógł debugować w ojczystym kodzie źródłowym.
A na co komu assembly, skoro IDE ma narzędzia do podglądania zmiennych lokalnych? :|
Eh googluj jakie są różnice między PAnisChar, a cstring itp.
Żadne — C-String to zwykły wskaźnik na zwykłą tablicę bajtów, w której najbliższy początkowi znak NULL
oznacza koniec zawartości ciągu (zawartości, ale niekoniecznie bloku pamięci). W Pascalach typ PAnsiChar
to zwykły wskaźnik na znak, kompatybilny z C-Stringami.
Delphi ma czasem swoje smaczki jak pierwszy element stringa to liczba zawierająca jego długość […]
Typ AnsiString
nigdy nie przechowywał swojej długości w pierwszym bajcie i trudno żeby przechowywał, skoro taki ciąg może mieć ~dowolną długość. Typ ten posiada metadane przed komórką zawierającą pierwszy znak, ale nie w formie jednobajtowego licznika, a czterobajtowego, tak samo jak licznik referencji.
[…] nie wiem czy dalej to jest, bo nie umiem tego języka, ale kiedyś tak to zaprojektowali.
No to skoro nie wiesz, to się nie wypowiadaj i nie wprowadzaj zamieszania, a swoją wiedzę z zakresu Turbo Pascala odnieś do najbliższego muzeum.