Как контейнеры stl удаляются? - PullRequest
6 голосов
/ 20 декабря 2008

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

EDIT

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

Ответы [ 12 ]

0 голосов
/ 20 декабря 2008

Чтобы ответить на ваш первый вопрос:

В классах STL нет ничего особенного (надеюсь). Они функционируют точно так же, как и другие классы шаблонов. Таким образом, они не уничтожаются автоматически, если размещаются в куче, потому что в C ++ нет сборки мусора (если вы не скажете это с какой-нибудь изворотливой работой autoptr или чем-то еще). Если вы разместите его в стеке (без нового), он, скорее всего, будет автоматически управляться C ++.

Что касается вашего второго вопроса, вот очень простой класс ArrayOfTen, демонстрирующий основы типичного управления памятью в C ++:

/* Holds ten Objects. */
class ArrayOfTen {
    public:
        ArrayOfTen() {
            m_data = new Object[10];
        }

        ~ArrayOfTen() {
            delete[] m_data;
        }

        Object &operator[](int index) {
            /* TODO Range checking */
            return m_data[index];
        }

    private:
        Object *m_data;

        ArrayOfTen &operator=(const ArrayOfTen &) { }
};

ArrayOfTen myArray;
myArray[0] = Object("hello world"); // bleh

По сути, класс ArrayOfTen хранит внутренний массив из десяти элементов Object в куче. Когда в конструкторе вызывается new [], в куче выделяется место для десяти объектов, и создаются десять объектов. Аналогично, когда в деструкторе вызывается delete [], десять объектов разрушаются, а затем выделяемая ранее память освобождается.

Для большинства (всех?) Типов STL изменение размера выполняется за кулисами, чтобы обеспечить достаточный набор памяти для размещения ваших элементов. Вышеуказанный класс поддерживает только массивы из десяти объектов. Это в основном очень ограниченная typedef для Object [10].

0 голосов
/ 20 декабря 2008

Как и любой другой объект в куче, он должен быть уничтожен вручную (с удалением).

...