Я хотел бы дать другое представление здесь и сосредоточиться на векторе указателей
vector<T*> obj {new T(), new T()}
и разнице между уничтожением и освобождением указателей в нем. (Вот как я понимаю ваш вопрос, но, возможно, вы уже знаете все это: D)
Прежде всего: этот вектор содержит только указатели. Указатель обычно имеет длину 4 или 8 байтов. Давайте предположим, что это 8, а вектор содержит 2 указателя, поэтому он должен выделить 16 байтов независимо от sizeof(T)
. Два объекта, выделенных с помощью new
, находятся где-то еще в куче.
Давайте предположим, что этот вектор уничтожен, например, потому что он выходит из области видимости в некоторой функции. Он уничтожит каждый элемент внутри вектора и освободит память, выделенную вектором (например, 16 байтов в этом примере).
- Уничтожение указателя ничего не делает, так как указатель не намного больше, чем числовое значение c, которое указывает место в памяти. Хотя
T
может иметь деструктор, T*
не имеет . - Удаление означает только освобождение памяти, которая используется для хранения указателей . Память, на которую указывают эти указатели, полностью не тронута.
Это похоже на другой пример, который вы привели:
MyClass *obj = new MyClass();
Если obj
выходит из области видимости, деструктор MyClass
будет не вызываться, сама obj
(4 или 8 байт, как указано выше) будет освобождена, но память, на которую указывает obj
, не будет затронута. Это приводит к утечке памяти, и то же самое происходит для вектора выше.
Только указатели пропали, память, на которую они указывали, остается.
Это почти то же самое для вектора со значениями
vector<T> obj {T(), T()}
Тот же сценарий, что и выше , но теперь объекты хранятся в памяти, выделенной вектором. Таким образом, вектор должен теперь выделить 2 * sizeof(T)
байт, чтобы содержать два объекта. Когда вектор уничтожается, происходит то же, что и выше:
- Каждый элемент уничтожается. Если у
T
есть деструктор, он называется. - Память, выделенная вектором (
2 * sizeof(T)
байт), освобождается
Это похоже на
MyClass obj;
Когда это выходит из области видимости, будет вызван деструктор ~MyClass
и будет освобождена память obj
(sizeof(MyClass)
байт). Не происходит утечки памяти, как в приведенном выше векторе.