Это не одно и то же. В большинстве объектно-ориентированных языков, особенно в тех, которые имеют встроенную сборку мусора любого типа, все объекты размещаются в куче, а переменные всегда содержат указатель на объект, а не сам объект.
C ++ - один из немногих объектно-ориентированных языков, где вы можете ссылаться на объект по значению.
В случае new
вы создаете объект и получаете указатель на него. Затем вы будете ссылаться на объект через указатель, а не напрямую. В другом случае вы создаете объект в стеке, и контейнер будет хранить свои собственные копии.
Часто копии на основе стека будут упоминаться ссылкой (вся идея &
обозначена как спецификатор типа), но обычно считается, что эти ссылки недолговечны, и обычно делается копия того объекта, на который делается ссылка если эту вещь нужно хранить некоторое время.
В частности, в этом случае, если у вас есть контейнер указателей (т.е. ::std::vector<SubElement *> c
), он хранит указатели на объекты, и вы обычно выделяете их с помощью new
. Но стандартные контейнерные классы библиотеки (и большинство других контейнерных классов) не удаляют указатели для вас. Они не берут «владение» указателем. Таким образом, вы сами будете отвечать за их удаление.
Если у вас есть контейнер объектов (например, ::std::vector<SubElement> c
), вы должны использовать форму c.push_back(SubElement())
, и в этом контейнере будут храниться копии созданных вами временных файлов. Контейнер становится владельцем этих копий, а также часто копирует их изнутри. Вот почему объекты, которые вы храните по значению в контейнере, должны реализовывать конструктор копирования.
Есть способ заставить контейнер получить владение указателями, но только косвенно. В контейнере можно хранить копии объектов, которые сами становятся собственниками. Для этого используют стандартный класс ::std::tr1::shared_ptr<T>
. Ваша декларация контейнера будет выглядеть так: ::std::vector< ::std::tr1::shared_ptr<SubElement> > c
. Затем вы можете сделать: c.push_back(new SubElement());
и контейнер удалит объекты SubElement, когда это будет сделано.
Вы должны прочитать shared_ptr
и по-настоящему понять, что он делает, прежде чем использовать его.