C++ за 21 день седьмое издание



Download 1,38 Mb.
bet162/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   158   159   160   161   162   163   164   165   ...   437
Bog'liq
word1

if(Initiallnput != NULL)




  1. {




  1. Buffer = new char [strlen(Initiallnput) + 1];




  1. strcpy(Buffer, Initiallnput);




  1. }




  1. else




  1. Buffer = NULL;




  1. }

2 0 :



  1. // Деструктор




  1. ~MyString()




  1. {




  1. cout « "Invoking destructor, clearing up" « endl;




  1. if (Buffer != NULL)




  1. delete [] Buffer;




  1. }



28:



  1. int GetLengthO




  1. {




  1. return strlen(Buffer);




  1. }



33:



  1. const char* GetStringO




  1. {




  1. return Buffer;




  1. }




  1. };



39:



  1. void UseMyString(MyString Input)




  1. {




  1. cout « "String buffer in MyString is " « Input.GetLength();

    43:

    cout « " characters long" «

    endl;

    44:







  2. cout « "Buffer contains: " « Input.GetString() « endl;




  1. return;




  1. }



48:



  1. int main()




  1. {




  1. SayHello("Hello_from_String_Class");'>MyString SayHello("Hello from String Class");








  1. // Передать SayHello функции как параметр




  1. UseMyString(SayHello);



55:



  1. return 0;




  1. }



Результат


String buffer in MyString is 23 characters long Buffer contains: Hello from String Class Invoking destructor, clearing up Invoking destructor, clearing up


<отказ, как можно заметить на рис. 9.2>
Конструктор копий 225

РИС. 9.2. Снимок экрана аварийного отказа, произо­ шедшего при выполнении кода листинга 9.8 (режим отладки среды разработки Visual Studio)




Анализ

Почему класс, который только что прекрасно работал в листинге 9.6, привел к отказу





  1. листинге 9.7? Единственное различие между листингами 9.6 и 9.7 в том, что задача ис­ пользования объекта S a y H e llo класса M y S t r in g , созданного в функции m a in (), была делегирована функции U s e M y S t r in g (), вызываемой а строке 54. Делегирование работы ггой функции привело к тому, что объект S a y H e llo в функции m a in () копируется в ар­ гумент параметра I n p u t, используемого в функции U s e M y S t r in g ( ) . Эта копия создается компилятором, поскольку функция была объявлена как получающая параметр I n p u t по значению, а не по ссылке. Компилятор создает двоичную копию простых старых данных, таких, как целые числа, символы и указатели. Таким образом, значение, содержащееся в указателе S a y H e llo . B u f f e r , было просто скопировано в параметр I n p u t , т.е. он теперь указывает на ту же область памяти, что и I n p u t . B u f f e r (рис. 9.3).

РИС. 9.3. Поверхностное копирование объекта SayHello в параметр Input при вы зове функции UseMyString ()


Двоичная копия не обеспечивает глубокого копирования (deep сору) и не распро­ страняется на указываемую область памяти, поэтому теперь есть два объекта класса M y S t r in g , указывающих на ту же область в памяти. Таким образом, по завершении работы функции U s e M y S t r in g () переменная I n p u t выходит из области видимости и удаляется. При этом вызывается деструктор класса M y S t r in g , и его код в строке 26



: Зак. 3626

226 ЗАНЯТИЕ 9. Классы и объекты

листинга 9.8 освобож дает при помощи оператора d e l e t e память, зарезервированную для буфера. Обратите внимание, что этот вызов оператора d e l e t e объявляет недействи­ тельной область памяти, на которую есть указатель в объекте S a y H e llo , находящемся





  1. функции m ain (). Когда функция m ain () заверш ается, объект S a y H e llo выходит из области видимости и удаляется. Однако на сей раз строка 26 повторно вызывает опера­

тор d e l e t e для адреса области памяти, который уже недействителен (уже освобожден





  1. объявлен недействительным при удалении параметра I n p u t) . Результатом повторного удаления и будет аварийный отказ. Обратите внимание, что сообщ ение режима отладки, представленное на рис. 9.2, упоминает строку 52 (строка 51 в листинге, ведь строки в книге отсчитываются от нуля), поскольку здесь используется объект S a y H e llo , который не был освобожден успешно.

Компилятор в данном случае не смог автоматически обеспечить глубокое ко­ пирование, поскольку на момент компиляции ему неизвестно ни количество байтов, на которые указывает указатель-член MyString::Buffer, ни харак­ тер резервирования.

Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   158   159   160   161   162   163   164   165   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish