2013-06-04 11 views
6

Chcę naprawić błąd projektowy w rekordowej TMyValue, która była używana od lat, i rozpaczliwie chcę ją naprawić w samym rekordzie - aby uniknąć zmiany publicznego interfejsu - i nie wymagać kod używający rekordu do zmiany.Gwarancja inicjalizacji rekordu stosu

Zasadniczo wadą jest to, że wartość TMyValue musi zostać zainicjowana do zera, gdy zostanie utworzona, w przeciwnym razie wywołanie metody Clear na niej może spowodować awarię. Dzieje się tak dlatego, że zawiera pole, które jest wskaźnikiem do dynamicznie przydzielanej pamięci, jeśli wskaźnik jest zerowy, a Wyczyść powoduje zwolnienie pamięci dynamicznej.

Jest to problem, jeśli wartość TMyValue została utworzona na stosie, ponieważ zmienne stosu nie są wyliczane automatycznie po ich utworzeniu.

Pomyślałem, że mogę użyć konstruktora rekordów do wyzerowania rekordu, ale konstruktory rekordów nie mogą być bez parametrów. Prawdopodobnie oznacza to, że nie można wymusić automatycznego wykonania konstruktora rekordów podczas tworzenia rekordu na stosie.

Podejrzewam, że odpowiedź na moje pytanie brzmi "nie da się tego zrobić". Proszę, udowodnij, że jestem zły!

Odpowiedz

7

Dodaj manekina ciąg znaków do swojego rekordu. Ponieważ ciąg jest typem zarządzanym, zostanie zainicjowany na pusty ciąg, gdy rekord znajdzie się w zakresie.

Tak więc wywołując metodę Wyczyść, sprawdź, czy pusty łańcuch jest pusty jako pierwszy. Ustaw ciąg znaków na wartość, jeśli jest odpowiedni do logiki użycia, aby oznaczyć rekord jako zainicjowany.

+0

Nice. Zawsze lubię ułatwiać kompilatorowi życie. –

+1

@MarjanVenema, wiedząc, że niektóre sztuczki są zawsze dobre. Ale możliwość zadeklarowania rutyny inicjalizacji/finalizacji na rekordach powinna zostać wdrożona wiele lat temu. Patrz ['QC21729 Operator rekordów Przeciążanie: Proszę zaimplementować operatory" Initialize "i" Finalize "] (http://qc.embarcadero.com/wc/qcmain.aspx?d=21729). Chciałbym dodać, że wszystkie procedury wewnętrzne powinny również być możliwe do wykorzystania w rekordach z operatorami klas. Mam na myśli Kopię, Wysokie, Niskie, Długość, SetLength itp. –

+0

O tak! Głosowanie w trakcie pisania ... –