2015-07-15 9 views
5

Czy można przydzielić wskaźnik jednego typu i wyrzucić go jako inny typ, ale o tym samym rozmiarze? Mam na myśli to:Można przydzielić wskaźnik jednego typu i wyrzucić go jako inny typ, ale o tym samym rozmiarze?

procedure TForm1.Button1Click(Sender: TObject); 
var A:PInt64; // 64bit 
    P:Pointer; 
    B:PDouble; // 64bit 
begin 
    New(A); 
    P:=A; 
    B:=P; 
    Dispose(B); 
end; 

Załóżmy, że chcę tego tylko dla typów 8, 16, 32, 64bit podpisanych i niepodpisanych. W porządku ?

+2

Lekcja poglądowa, jak pisać niezniszczalny kod! – MartynA

+1

Nie ma znaczenia, czy jest możliwe do utrzymania, czy nie, chcę wiedzieć tylko, czy działa, czy jest przydzielone i rozmieszczone w tej samej lokalizacji pamięci ... Naprawdę muszę to zrobić. –

+0

Dobrze, ale kiedy odkryjesz wyciek pamięci w 18 miesięcy ... – MartynA

Odpowiedz

6

Jeśli wskazany typ nie jest typem zarządzanym, jest to bezpieczne. W twoim przypadku, ani Int64, ani Int64 nie są zarządzane, więc jest to bezpieczne.

Przykładem zarządzanym typu byłaby String, interfejs, Variant, procedura anonimowy/metoda, rekord zawierający zarządzanych rodzajów itp

Podczas korzystania New i Dispose na zarządzanym typu obiekt musi być zainicjalizowane i sfinalizowane. Gdy używasz New i Dispose na typie niezarządzanym, jest to równoważne wywoływaniu GetMem i FreeMem.

W rzeczywistości nie ma potrzeby, aby wskazane typy miały ten sam rozmiar. Po wywołaniu FreeMem rozmiar typu nie jest przekazywany. Wskazana pamięć zawiera metadane dla każdego bloku, który pozwala mu zwolnić cały blok.

+0

Tak, miałem do czynienia z niezmienionymi typami. Nie wiedziałem, że tak się nazywają. AnsiChar i WideChar są zarządzane? –

+1

Nie, są niezarządzane. –

+0

@ "twoja ostatnia fraza" - Więc może to w ten sposób, że nie otrzymam raportu wycieku pamięci, jeśli ustawię opcję "ReportMemoryLeaksOnShutdown: = True" i przydzielę PD i zdemontuję ją jako PByte ... –

Powiązane problemy