Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

Свободная память (куча) (free store (heap)). Объекты, созданные с помощью оператора new, размещаются в свободной памяти.

Рассмотрим пример.

vector vg(10); // создается один раз при старте программы

                    // ("до функции main")

vector* f(int x)

{

  static vector vs(x); // создается только при первом

                            // вызове f

  vector vf(x+x);      // создается при каждом вызове f

  for (int i=1; i<10; ++i) {

    vector vl(i);      // создается на каждой итерации

    // ...

  }    // переменная v1 уничтожается здесь (на каждой итерации)

  return new vector(vf); // создается в свободной памяти

                              // как копия переменной vf

} // переменная vf уничтожается здесь

void ff

{

  vector* p = f(10); // получает вектор от функции f

  // .. .

  delete p;               // удаляет вектор, полученный от

                          // функции f

}

Переменные vg и vs, размещенные в статической памяти, уничтожаются по завершении программы (после функции main), при условии, что они были созданы.

Память для членов класса отдельно не выделяется. Когда вы размещаете объект где-то, то нестатические члены размещаются там же (в том же классе памяти, что и сам объект, которому они принадлежат).

Код хранится отдельно от данных. Например, функция-член не хранится в каждом объекте своего класса; одна ее копия хранится вместе с остальной частью кода программы.

См. также разделы 14.3 и 17.4.

<p id="AutBody_Root585"><strong>A.4.3. Время жизни</strong></p>

Перед тем как объект будет (легально) использован, он должен быть проинициализирован. Эту инициализацию можно осуществить явно, с помощью инициализатора, или неявно, используя конструктор или правило инициализации объектов встроенных типов по умолчанию. Время жизни объекта заканчивается в точке, определенной его областью видимости и классом памяти (например, см. разделы 17.4 и Б.4.2).

Локальные (автоматические) объекты создаются, когда поток выполнения достигает их определения, и уничтожаются при выходе из области видимости.

Временные объекты создаются конкретным подвыражением и уничтожаются по завершении полного выражения. Полное выражение — это выражение, которое не является подвыражением другого выражения.

Объекты в пространстве имен и статические члены классов создаются в начале программы (до функции main) и уничтожаются в конце программы (после функции main”).

Локальные статические объекты создаются, когда поток выполнения достигает их определения и (если они были созданы) уничтожаются в конце программы.

Объекты в свободной памяти создаются оператором new и (необязательно) уничтожаются с помощью оператора delete.

Временная переменная, связанная с локальной ссылкой, существует столько же, сколько и сама ссылка. Рассмотрим пример.

const char* string_tbl[] = { "Mozart", "Grieg", "Haydn", "Chopin" };

const char* f(int i) { return string_tbl[i]; }

void g(string s){}

void h

{

  const string& r = f(0);  // связываем временную строку

  // с ссылкой r

  g(f(1));                 // создаем временную строку

                           // и передаем ее

  string s = f(2);         // инициализируем s временной строкой

  cout << "f(3): " << f(3) // создаем временную строку

                           // и передаем ее

       << "s: " << s

       << "r: " << r << '\n';

}

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

f(3): Chopin s: Haydn r: Mozart

Временные строки, сгенерированные при вызовах f(1), f(2) и f(3), уничтожаются в конце выражения, в котором они были созданы. Однако временная строка, сгенерированная при вызове f(0), связана с переменной r и “живет” до конца функции h.

<p id="AutBody_Root586"><strong>A.5. Выражения</strong></p>
Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT