Многое из того, что вы говорите, является либо деталями реализации, либо зависит от контекста. Учтите это:
// file.cpp
Rectangle r1(1,2,3,4);
int main()
{
Rectangle r2 = r1;
Rectangle * r3 = new Rectangle(r1);
}
Здесь r1
имеет статическое хранилище и статическое (= постоянное) время жизни , тогда как r2
имеет автоматическое хранилище и автоматическое (= объем) время жизни . Таким образом, r1
создается при запуске программы и уничтожается в конце (после возврата main
), тогда как r2
создается при объявлении и уничтожается в конце своей области видимости (то есть область действия тела функции в данном случае).
Указатель r3
указывает на Rectangle
объект динамическое хранилище и динамическое (= ручное) время жизни . Объект *r3
оживает в выражении new
, и он будет уничтожен только по запросу пользователя через соответствующее выражение delete
(или, возможно, ручной вызов деструктора). Так как мы не уничтожаем его, на самом деле это утечка .
Ничего не известно о памяти , используемой *r3
, за исключением того, что эта память выделяется статической функцией-членом Rectangle::operator new()
, если она существует, или иным образом глобальной функцией выделения ::operator new
, Память глобальной версии обычно называется «бесплатным хранилищем».
(Все три объекта r1
, r2
и *r3
предположительно равны, поскольку r2
и *r3
созданы как копии r1
.)
Ситуация становится еще интереснее, если учесть переменные-члены: struct Foo { Rectangle r; };
.