• new
, размещаются в свободной памяти.
Рассмотрим пример.
vector
// ("до функции main")
vector
{
static vector
// вызове f
vector
for (int i=1; i<10; ++i) {
vector
// ...
} // переменная v1 уничтожается здесь (на каждой итерации)
return new vector
// как копия переменной vf
} // переменная vf уничтожается здесь
void ff
{
vector
// .. .
delete p; // удаляет вектор, полученный от
// функции f
}
Переменные vg
и vs
, размещенные в статической памяти, уничтожаются по завершении программы (после функции main
), при условии, что они были созданы.
Память для членов класса отдельно не выделяется. Когда вы размещаете объект где-то, то нестатические члены размещаются там же (в том же классе памяти, что и сам объект, которому они принадлежат).
Код хранится отдельно от данных. Например, функция-член не хранится в каждом объекте своего класса; одна ее копия хранится вместе с остальной частью кода программы.
См. также разделы 14.3 и 17.4.
A.4.3. Время жизни
Перед тем как объект будет (легально) использован, он должен быть проинициализирован. Эту инициализацию можно осуществить явно, с помощью инициализатора, или неявно, используя конструктор или правило инициализации объектов встроенных типов по умолчанию. Время жизни объекта заканчивается в точке, определенной его областью видимости и классом памяти (например, см. разделы 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
.
A.5. Выражения