Работа с динамически распределенной памятью в контейнерных классах - PullRequest
1 голос
/ 15 января 2012

Мне трудно понять, как контейнеры реализованы в C ++.В частности, как я могу иметь дело с данными, размещенными в стеке, против данных, выделенных в куче.Например:

vector<int> VectorA;
VectorA.push_back (1);
VectorA.push_back (2);
VectorA.push_back (3);

vector<int*> VectorB;
VectorB.push_back (new int (1));
VectorB.push_back (new int (2));
VectorB.push_back (new int (3));

Как можно убедиться, что целые числа в VectorB удалены должным образом.Я помню, как читал где-то, что std :: vector только вызывает деструктор и фактически ничего не удаляет.Кроме того, если бы я хотел реализовать свой собственный класс LinkedList, как бы я справился с этой конкретной проблемой?

Ответы [ 3 ]

4 голосов
/ 15 января 2012

Идеальный способ решить эту проблему - использовать Smart Pointers в качестве элементов вашего контейнера вместо необработанных указателей.
В противном случае вам придется вручную сделать управление памятью самостоятельно .

2 голосов
/ 15 января 2012

Объекты, хранящиеся в векторе, все равно сохраняются в куче (в пространстве, выделенном вектором).

Преимущество в выделении объектов по отдельности очень мало (опция B), если только вы не собираетесь управлять ими как-то вне вектора. В этом случае вектор может просто уничтожить хранящиеся в нем указатели и доверять реальному владельцу уничтожить сами объекты.

0 голосов
/ 15 января 2012

Короткий ответ: большинство вообще не имеют дело с такими вещами.Стандартные контейнеры (например, std::vector) вообще не хранят исходный объект - они хранят копию объекта.Они управляют хранилищем для своей собственной копии, и вам остается управлять хранилищем для оригинала.

В случае хранения указателей, вы в основном берете на себя ответственность за управление хранилищем, на которое указывает указатель.,Контейнер все еще делает (и управляет хранилищем) копию, но это всего лишь копия указателя, а не объект, к которому он относится.Это ваше дело.

...