C Kruczki i fortele w program, aby odzyskać pamięć obiektu w przypadku, kiedy " wyjdzie poza zakres...

Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.

Jednak z użyciem " wiążą się dwa typowe błędy. Pierwszy to założenie, że
" może odnosić się do tablicy.
)" "$%*'
"$%! "$%
!
+
Funkcja jest podatna na błędy, gdyż zaalokowana tablica nie zostanie odzy-
skana, jeśli podczas wykonania funkcji pojawi się wyjątek lub jeśli niedbały serwisant spowoduje wcześniejsze wyjście z funkcji. Potrzebny jest uchwyt zasobu, jest nim standardowo " :
)" "$%*'
$""$% ! "$%
+
Jednak " to standardowy uchwyt zasobu pojedynczego obiektu, a nie tablicy
obiektów. Kiedy wychodzi poza zakres i aktywowany jest jego destruktor, do tablicy wartości " zaalokowanej tablicowym operatorem (zobacz zagadnienie numer 60) stosowane jest nietablicowe zwalnianie pamięci. Wynika to stąd, że, niestety, kompilator nie potrafi odróżnić wskaźnika tablicy od wskaźnika pojedynczego obiektu.
Szczęśliwym zbiegiem okoliczności kod ten może czasem działać w niektórych systemach, zaś problem może zostać wykryty jedynie przy przenoszeniu oprogramowania na inny system lub podczas aktualizacji nowej wersji systemu istniejącego.
Lepszym rozwiązaniem jest użycie do standardowej struktury zamiast ,.
Standardowa struktura to w zasadzie uchwyt zasobu tablicy, rodzaj „autotablicy”
wzbogacony o szereg dodatkowych możliwości. Jednocześnie zapewne dobrym pomy-słem jest pozbycie się prymitywnego i niebezpiecznego używania jako parametrów formalnych wskaźników przysłaniających tablicę:
)" )""$% 7'
)""$% !#
+
Innym typowym błędem jest użycie " jako typu elementu z kontenera STL.
Kontenery STL nie narzucają zbyt dużych wymagań na swoje elementy, ale wymagają klasycznej semantyki kopiowania.
W standardzie " zdefiniowano w taki sposób, że niepoprawne jest ukonkret-
nienie kontenera STL typem elementu " . Próba spowoduje wyświetlenie błędu
kompilacji (prawdopodobnie dość mocno ukrytego). Jednak wiele istniejących implementacji nadal nie nadąża za standardem.
Zagadnienie 68: nieprawidłowe użycie auto_ptr
173
W powszechnych, przestarzałych implementacjach " jego semantyka kopii
doskonale odpowiada użyciu go jako typu elementu kontenera. Oznacza to, że do chwili otrzymania innej lub nowszej wersji biblioteki standardowej, taki kod nie będzie się kompilował. Bardzo to niedogodne, ale łatwo to naprawić.
Gorsza sytuacja zachodzi, kiedy implementacja " nie w pełni jest zgodna ze
standardem, więc można użyć jej do ukonkretnienia kontenera STL, ale semantyka kopiowania nie jest tym, czego wymaga STL. Jak opisano w zagadnieniu numer 10, kopiowanie " przenosi kontrolę wskazywanego obiektu i ustawia źródło kopio-
wania na " :
$"Y " 1 Z"#" /
$"Y " 1 3$
3$
Opisana właściwość jest w pewnych sytuacjach całkiem przydatna, ale nie o nią chodzi w przypadku elementów będących kontenerami STL:
)" $"Y " 1
$"Y " 1 !
"/ %* * #!
W niektórych systemach taki kod da się skompilować i uruchomić, ale zwykle nie warto się tym zajmować. Struktura obiektów 5 ' zostanie skopiowana na listę, ale
po zakończeniu kopiowania będzie zawierała wszystkie puste wskaźniki (" )!
Należy unikać używania " jako kontenera STL, nawet jeśli używany aktualnie
system na to pozwala.
Wątki
Powered by wordpress | Theme: simpletex | © Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.