С точки зрения управления памятью эти два класса практически идентичны. Несколько других респондентов предположили, что есть разница между двумя в том, что один выделяет хранилище в стеке, а другой - в куче, но это не обязательно так, и даже в тех случаях, когда это так, это ужасно вводит в заблуждение. В действительности все отличается от того, где выделены метаданные 1002 * для vector
; фактическое базовое хранилище в vector
выделяется из кучи независимо от
Это немного сложно увидеть, потому что вы используете std::vector
, поэтому конкретные детали реализации скрыты. Но в основном std::vector
реализован так:
template <class T>
class vector {
public:
vector() : mCapacity(0), mSize(0), mData(0) { }
~vector() { if (mData) delete[] mData; }
...
protected:
int mCapacity;
int mSize;
T *mData;
};
Как видите, сам класс vector
имеет только несколько членов - емкость, размер и указатель на динамически выделенный блок памяти, в котором будет храниться фактическое содержимое вектора.
В вашем примере единственное отличие состоит в том, откуда берется хранилище для этих нескольких полей. В первом примере хранилище выделяется из того хранилища, которое вы используете для своего содержащего класса - если оно выделено в куче, то будут и те немногие биты vector
. Если ваш контейнер распределен по стеку, то будут и те несколько битов vector
.
Во втором примере эти биты vector
всегда выделяются в куче.
В обоих примерах фактическое мясо из vector
- его содержимое - выделяется из кучи, и вы не можете это изменить.
Все остальные уже отметили, что у вас утечка памяти во втором примере, и это тоже правда. Обязательно удалите вектор в деструкторе вашего класса контейнера.