Ответ 1
Похоже, вам может понадобиться учебник по понятию "переменная" на С++.
В С++ всякое время жизни переменной привязано к нему, охватывая область. Простейшим примером этого является локальная переменная функции:
void foo() // foo scope begins
{
UnloadingShip anUnloadingShip; // constructed with default constructor
// do stuff without fear!
anUnloadingShip.Unload();
} // // foo scope ends, anything associated with it guaranteed to go away
В приведенном выше коде "anUnloadingShip" по умолчанию создается при вводе функции foo (т.е. вводится ее область). Нет "нового". Когда охват охвата исчезает (в этом случае, когда foo выходит), ваш пользовательский деструктор автоматически вызывается для очистки UnloadingShip. Связанная память автоматически очищается.
Когда охватывающая область видимости является классом С++ (то есть переменной-членом):
class UnloadingBay
{
int foo;
UnloadingShip unloadingShip;
};
время жизни привязано к экземплярам класса, поэтому, когда наша функция создает "UnloadingBay"
void bar2()
{
UnloadingBay aBay; /*no new required, default constructor called,
which calls UnloadingShip constructor for
it member unloadingShip*/
// do stuff!
} /*destructor fires, which in turn trigger member destructors*/
члены aBay строятся и живут до тех пор, пока живет "aBay".
Это все вычислено в время компиляции. Не существует подсчета ссылок во время выполнения, предотвращающих разрушение. Никаких соображений для чего-либо еще, что ссылается на или указывает на эту переменную. Компилятор анализирует функции, которые мы написали, чтобы определить область действия и, следовательно, время жизни переменных. Компилятор видит, где заканчивается область переменных, и все необходимое для очистки этой переменной будет вставлено во время компиляции.
"новый", "NULL", (не забывайте "удалить" ) в С++ приходят в игру с указателями. Указатели - это тип переменной, которая содержит адрес памяти некоторого объекта. Программисты используют значение "NULL", чтобы указать, что указатель не содержит адрес (то есть он не указывает ни на что). Если вы не используете указатели, вам не нужно думать о NULL.
До тех пор, пока вы не освоитесь с тем, как переменные на С++ входят и выходят из области действия, избегайте указателей. Это еще одна тема.
Удачи!