Poznaj C++ w$ godziny0199

Poznaj C++ w$ godziny0199



190 Godzina 13

_________ Płytkie kopiowanie polega na skopiowaniu wartości zmiennych obiektu

źródłowego do obiektu tworzonego. Jeśli w obiekcie występują wskaźniki to w efekcie końcowym otrzymamy dwa obiekty, w których te wskaźniki wskazują na tę samą pamięć. Wskaźników nie należy kopiować bezpośrednio. Należy wykonać kopie wartości przechowywanych pod adresami przez nie wskazywanymi do nowego obszaru pamięci.

Jeśli klasa KOT będzie zawierać zmienną jegoWiek wskazującą na wartość typu

int na stercie, to konstruktor kopiujący skopiuje wartość tej zmiennej (czyli adres w niej zawarty) do zmiennej jegoWiek obiektu tworzonego. Oba wskaźniki będą wskazywać na ten sam obszar pamięci, tak jak pokazano na rysunku 13.1.

Takie rozwiązanie spowoduje katastrofę, gdy jeden z obiektów zostanie usunięty z pamięci. Zostanie wtedy wywołany destruktor klasy KOT, który zwolni zarezerwowaną na stercie pamięć.

Załóżmy, że z pamięci zostanie usunięty oryginalny obiekt KOT. Destruktor zwolni zarezerwowaną pamięć. Jednak kopia nadal będzie wskazywać na ten obszar. Jeśli będziesz próbował dostać się do tej pamięci to twój program przestanie działać... jeśli będziesz miał szczęście. Rysunek 13.2. ilustruje opisaną sytuację.

Sterta

-►

5

oryginalny

nowy KOT

KOT

jegoWiek

jegoWiek



Rysunek 13.1

Wykorzystanie

domyślnego

konstruktora

kopiującego

Rysunek 13.2

Powstawanie

błędnego

wskaźnika

Rozwiązaniem tego problemu jest napisanie własnego konstruktora kopiującego i rezerwacja pamięci we własnym zakresie. Jeśli pamięć zostanie zarezerwowana, to wartości z oryginalnego obiektu (w szczególności te wskazywane przez wskaźniki) mogą zostać do niej skopiowane. Takie kopiowanie nazywamy głębokim. Ilustruje to listing 13.3.

Płytkie kopiowanie polega na skopiowaniu wartości zmiennych obiektu źródłowego do obiektu tworzonego. Jeśli w obiekcie występują wskaźniki to w efekcie końcowym otrzymamy dwa obiekty, w których te wskaźniki wskazują na tę samą pamięć. Wskaźników nie należy kopiować bezpośrednio. Należy wykonać kopie wartości przechowywanych pod adresami przez nie wskazywanymi do nowego obszaru pamięci.

NOWY TERMIN


Jeśli klasa KOT będzie zawierać zmienną jegoWiek wskazującą na wartość typu int na stercie, to konstruktor kopiujący skopiuje wartość tej zmiennej (czyli adres w niej zawarty) do zmiennej jegoWiek obiektu tworzonego. Oba wskaźniki będą wskazywać na ten sam obszar pamięci, tak jak pokazano na rysunku 13.1.

Takie rozwiązanie spowoduje katastrofę, gdy jeden z obiektów zostanie usunięty z pamięci. Zostanie wtedy wywołany destruktor klasy KOT, który zwolni zarezerwowaną na stercie pamięć.

Załóżmy, że z pamięci zostanie usunięty oryginalny obiekt KOT. Destruktor zwolni zarezerwowaną pamięć. Jednak kopia nadal będzie wskazywać na ten obszar. Jeśli będziesz próbował dostać się do tej pamięci to twój program przestanie działać... jeśli będziesz miał szczęście. Rysunek 13.2. ilustruje opisaną sytuację.


Rysunek 13.1

Wykorzystanie

domyślnego

konstruktora

kopiującego

Rysunek 13.2

Powstawanie

błędnego

wskaźnika

Rozwiązaniem tego problemu jest napisanie własnego konstruktora kopiującego i rezerwacja pamięci we własnym zakresie. Jeśli pamięć zostanie zarezerwowana, to wartości z oryginalnego obiektu (w szczególności te wskazywane przez wskaźniki) mogą zostać do niej skopiowane. Takie kopiowanie nazywamy głębokim. Ilustruje to listing 13.3.


Wyszukiwarka

Podobne podstrony:
DSC00063 (13) Operacja modyfikowania polega na: •    zmianie wartości atrybutu nieklu
Poznaj C++ w$ godziny0001 Gdy masz czas tylko na właściwe rozwiązania... Intersoftlcind Gdy masz cza
Poznaj C++ w$ godziny0085 Funkcje 71Przeciążanie funkcji C++ pozwala na stworzenie więcej niż jednej
Poznaj C++ w$ godziny0166 Referencje 155 Referencje 155 ANALIZA: W linii 8 deklarujemy zmienną lokal
Poznaj C++ w$ godziny0174 Referencje 163 Linie 24-26 zamieniają wartości. Efekt zamiany wypisywany j
grB 13)    Negocjacje rzeczowe polegają na: a)    daleko idących
1 (13) Metoda immersyjna polega na pomiarze masy próbki w powietrzu oraz w cieczy immersyjnej o znan
img124 (13) 124 rzędzi pomiarowych. Na jej wartość składają się ściślej ale określona błędy na poszc
strojenia polegające na obliczeniu wartości, które minimalizują określony wskaźnik jakości
IMAG0614 (4) wycena nieruchomości Określenie wartości nieruchomości polega na określeniu wartości pr
IMAG0620 (2) Wycena nieruchomości Podejścia porównawcza Polega na określeniu wartości nieruchomości
IMAG0622 (2) Wycena nieruchomości Podljki* kosztowe Polega na określeniu wartości nieruchomości przy
img109 (2) NORMOWANIE PRACY Normowanie pracy polega na ustaleniu wartości czasu pracy niezbędnego do
pagon6 Degradacja środowiska polega na obniżeniu wartości, jakości i roli poszczególnych komponentó
3. Wykonanie ćwiczenia a)Metoda pomiaru Pomiar polega na zmierzeniu wartości SEM ogniw chemicznych o
3. Wykonanie ćwiczenia a) Metoda pomiaru Pomiar polega na zmierzeniu wartości SEM ogniw chemicznych

więcej podobnych podstron