Как контейнеры stl удаляются?

Как уничтожается контейнерный объект, такой как vector, в stl, даже если он создается в куче?

РЕДАКТИРОВАТЬ

Если контейнер содержит указатели, то как уничтожить эти объекты указателя

Ответы на вопрос(3)

vector<T*>ваш код должен удалить эти указатели перед удалением вектора: в противном случае эта память просочилась.

Знайте, что C ++ не выполняет сборку мусора, вот пример того, почему (извинения за синтаксические ошибки, уже давно я написал C ++):

typedef vector<T*> vt;
⋮
vt *vt1 = new vt, *vt2 = new vt;
T* t = new T;
vt1.push_back(t);
vt2.push_b,ack(t);
⋮
delete vt1;

Последняя строка (delete vt1;) явно не следует удалять указатель, который он содержит; в конце концов, это также в vt2. Так что нет. И не будет удалениеvt2.

(Если вам нужен векторный тип, который удаляет указатели при уничтожении, такой тип, конечно, можно написать. Вероятно, так и было. Но остерегайтесь указателей удаления, которые кто-то еще хранит копию.)

 Martin York21 дек. 2008 г., 04:51
Да, это имеет: boost :: ptr_vector. (см. надстройку над контейнерами)

компилятор вызывает его деструктор, который, в свою очередь, освобождает выделенную память в куче.

Решение Вопроса

т пространство, в котором находится указатель. Если вы хотите, чтобы вектор очищал данные указателя, вам нужно использовать интеллектуальную реализацию указателя:

{
    std::vector<SomeClass*> v1;
    v1.push_back(new SomeClass());

    std::vector<boost::shared_ptr<SomeClass> > v2;
    boost::shared_ptr<SomeClass> obj(new SomeClass);
    v2.push_back(obj);
}

Когда эта область заканчивается, оба вектора освободят свои внутренние массивы. v1 будет пропускать созданный SomeClass, поскольку в массиве находится только указатель на него. v2 не пропустит никаких данных.

Ваш ответ на вопрос