АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Использование конструкторов и деструкторов для выделения и освобождения свободной памяти

Читайте также:
  1. А) ИСПОЛЬЗОВАНИЕ КАТЕГОРИИ ВИДА В РУССКОМ ЯЗЫКЕ
  2. А) процесс выделения на электродах веществ, входящих в состав электролита Б) объединение ионов разных
  3. Административная ответственность за нарушения прав на использование информацией
  4. Анатомо-физиологические особенности органов мочеобразования и мочевыделения у детей. Методы обследования. Семиотика.
  5. Бактериофаги. Получение, титрование, использование.
  6. Вещества, способы их выделения
  7. Виды общественного производства и основания их выделения. Характер взаимозависимости основных сфер жизни общества .
  8. Виды освобождения от уголовного наказания
  9. Виды памяти.
  10. Виды памяти.
  11. Вопрос 5.4. Распределение и использование прибыли на предприятии.
  12. Вторичное использование материалов

 

// newstr.cpp

 

// использование оператора new для выделения памяти под строку
#include <iostream>
#include <cstring> //для strcpy(), и т.д.
using namespace std;

class String

{

private:

char* str; // указатель на строку

public:

String ( char* s ) // конструктор с одним параметром

{

int length = strlen ( s ); // вычисляем длину строки

str = new char [ length + 1 ]; // выделяем необходимую память

strcpy ( str, s ); // копируем строку

}

~String ( ) // деструктор

{

cout << "Удаляем строку\n";

delete [ ] str; // освобождаем память

}

void display ( ) // покажем строку на экране

{

cout << str << endl;

}

};

///////////////////////////////////////////////////////////

int main ( )

{

String s1 = "Тише едешь – дальше будешь.";

cout << "s1 = ";

s1.display ( );

 

return 0;

}

Результат работы программы будет следующим:

S1 - Тише едешь - дальше будешь.
Удаляем строку

 

Класс String имеет только одно поле str, являющееся указателем на char. Он будет указывать на строку, содержащуюся в объекте класса String. Здесь не будет массива, содержащего строку. Строка хранится в другом месте, а в классе String есть только указатель на нее.

 

Конструктор в программе newstr

Конструктор в этом примере имеет один аргумент: указатель на строку char*. С его помощью, используя операцию new, выделяется память для строки, на которую будет указывать указатель str. Затем конструктор использует функцию strcpy() для копирования строки в выделенный участок памяти.

 

Деструктор

Мы нечасто использовали деструктор в наших примерах, но теперь он нам необходим для освобождения памяти, выделенной с помощью операции new. При создании объекта мы выделяем для него память, и будет вполне разумным освободить эту память после того, как объект уже использован. деструктор — это функция, которая вызывается автоматически при удалении объекта. В программе NEWSTR деструктор выглядит следующим образом:

~String()
{

cout << "Удаляем строку.\n";
delete [ ] str;

}

Деструктор возвращает системе память, выделенную при создании объекта. Мы можем вывести в конце программы сообщение о том, что деструктор выполнил свою функцию. Объекты (как и другие переменные) обычно уничтожаются, когда функция, в которой они определены, заканчивает свою работу. Деструктор гарантирует, что память, выделенная для объекта класса String, будет возвращена системе при уничтожении объекта, а не останется неопределенной.



Мы должны заметить, что при использовании деструктора, как это показано в примере NEWSTR, могут возникнуть некоторые проблемы. При копировании одного объекта класса String в другой в строке s1-s2 в действительности происходит копирование указателя на реальную строку. Теперь оба объекта указывают на одну и ту же строку. При удалении строки деструктор удалит один указатель на строку, а указатель другого объекта будет указывать уже на что-то другое. Мы можем этого не заметить, так как процесс удаления объектов для нас невидим, например когда заканчивает свою работу функция, в которой был создан локальный объект.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |


Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)