Если вы накладываете искусственные ограничения типа «без использования нового», вы должны хорошо понимать C ++.Похоже, вы знакомы с некоторыми основами.
Давайте начнем с первой части вашей цели: «Создать переменную в любом месте кода без использования new;».В C ++ переменные не создаются с new
.Они созданы декларациями.new
создает неназванные объекты и возвращает указатель на этот объект.
У вас есть вторая цель, которая облегчает жизнь.«Убедитесь, что он никогда не будет освобожден».В C ++ вы должны выбрать, как хранить указатель, возвращаемый new
.Храните его в обычном (не интеллектуальном) указателе и не вызывайте delete
, и вы будете уверены, что объект никогда не освобождается.
Как вы правильно поняли, в C ++ не все объектысозданы new
.Объявления обычных переменных внутри функций создают локальные переменные, чьи объекты имеют время жизни, которое заканчивается, когда функция возвращается.Это неизбежно.
Вы можете иметь переменные внутри функций, которые выживают после возврата этих функций;они объявлены с static
.Их время жизни до конца программы.Но, похоже, они тебе не помогут;вы получаете одну и ту же переменную каждый раз, когда вызывается функция.И ваше дерево, очевидно, имеет более одного узла.Это действительно не удивительно.Как и глобальные объекты, память для static
объектов может быть выделена при запуске программы.Оба имеют так называемую статическую продолжительность хранения и занимают ограниченный объем памяти.
Итак, в заключение вы не можете избежать new
.Вы можете скрыть это, хотя.И вы, вероятно, должны.Используете ли вы std::vector<A>
или std::list<A>
, каждый объект A в контейнере в конечном итоге создается с помощью new
.