2015-07-15 16 views
5

È possibile assegnare un puntatore a un tipo e disporlo come un tipo diverso ma della stessa dimensione? Voglio dire, in questo modo:È possibile assegnare un puntatore a un tipo e disporlo come un tipo diverso ma della stessa dimensione?

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

Diciamo che voglio questo solo per 8, 16, 32, 64 bit firmato e tipi senza segno. Va bene ?

+2

Una lezione di oggetti su come scrivere codice non mantenibile! – MartynA

+1

Non importa se è manutenibile o meno, voglio sapere solo se funziona, se è allocato e disposto la stessa posizione di memoria ... Ho davvero bisogno di farlo. –

+0

Bene, ma quando si scopre una perdita di memoria tra 18 mesi ... – MartynA

risposta

6

Se il tipo a cui è indirizzato non è un tipo gestito, questo è sicuro. Nel tuo caso, né Int64Double sono tipi gestiti e quindi questo è sicuro.

Un esempio di un tipo gestito sarebbe una stringa, interfaccia, Variant, procedura anonima/metodo, un record che contiene i tipi gestiti, ecc

Quando si utilizza New e Dispose su un tipo gestito, l'oggetto deve essere inizializzato e finalizzato. Quando si utilizza New e Dispose su un tipo non gestito, equivale a chiamare GetMem e FreeMem.

In effetti, non è necessario che i tipi indicati abbiano la stessa dimensione. Quando viene effettuata la chiamata a FreeMem, la dimensione del tipo non viene passata. La memoria puntata ha metadati per ogni blocco che gli consente di deallocare l'intero blocco.

+0

Sì, mi riferisco ai tipi non modificati. Non sapevo che si chiamavano così. AnsiChar e WideChar sono gestiti? –

+1

No, non sono gestiti. –

+0

@ "la tua ultima frase" - Quindi forse è così che non ricevo il rapporto di perdita di memoria se imposto 'ReportMemoryLeaksOnShutdown: = True' e alloco un PDouble e lo dispongo come un PByte ... –

Problemi correlati