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!
Nice. Zawsze lubię ułatwiać kompilatorowi życie. –
@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. –
O tak! Głosowanie w trakcie pisania ... –