2013-06-04 11 views
6

Voglio correggere un difetto di progettazione in un record TMyValue che è stato in uso da anni e desidero disperatamente correggerlo nel record stesso - per evitare di cambiare l'interfaccia pubblica - e non richiedere il codice utilizzando il record da modificare.Inizializzazione della garanzia del record di stack

In sostanza, il difetto è che un TMyValue deve essere inizializzato a zero quando viene creato, altrimenti chiamare il metodo Clear su di esso può causare un arresto anomalo. Questo perché contiene un campo che è un puntatore alla memoria allocata dinamicamente se il puntatore non è zero e Clear causa la liberazione della memoria dinamica.

Questo è un problema se TMyValue viene creato nello stack, poiché le variabili di stack non vengono azzerate automaticamente quando vengono create.

Pensavo di poter utilizzare un costruttore di record per azzerare il record, ma i costruttori di record non possono essere senza parametri. Presumibilmente ciò significa che non è possibile forzare l'esecuzione automatica di un costruttore di record quando viene creato un record nello stack.

Sospetto che la risposta alla mia domanda sia "non può essere fatto". Per favore dimmi che sbaglio!

risposta

7

Aggiungere un membro stringa fittizio nel record. Poiché una stringa è un tipo gestito, verrà inizializzata su una stringa vuota quando il record entra nell'ambito.

Pertanto, quando si chiama il metodo Clear, verificare se la stringa dummy è vuota per prima. Impostare la stringa su un valore appropriato alla logica di utilizzo per contrassegnare il record come inizializzato.

+0

Bello. Mi piace sempre che il compilatore ti semplifichi la vita. –

+1

@MarjanVenema, conoscere alcuni trucchi è sempre buono. Ma essere in grado di dichiarare una routine di inizializzazione/finalizzazione sui record avrebbe dovuto essere implementata anni fa. Vedi ['Sovraccarico dell'operatore di registrazione QC21729: Si prega di implementare gli operatori" Inizializza "e" Completa "] (http://qc.embarcadero.com/wc/qcmain.aspx?d=21729). Vorrei aggiungere che tutte le procedure intrinseche dovrebbero poter essere utilizzate anche su record con operatori di classe. Voglio dire Copia, Alto, Basso, Lunghezza, SetLength ecc. –

+0

Oh sì! Votare mentre digito ... –

Problemi correlati