контейнер вне области и управление памятью

Возможный дубликат:
деструктор вызова метода std::list::remove каждого удаленного элемента?

Предположим, у меня есть это:

void f(...)
{
    .
    .
    std::list<X*> xList;
    . 
    // Then i fill the list
    std::list<X*>::iterator iter;
    for (iter = xList.begin(); iter != xList.end(); ++iter)
    {
         *iter = new X();
    }

}

Когда xList выходит за рамки, я знаю, что контейнер должен вызывать деструктор объектов, содержащихся в списке? Во-первых, это правда?

Если это так, то, поскольку список содержит указатели на класс X, не следует ли вызывать деструктор класса X, когда xList выходит за пределы области видимости? Таким образом освобождая любую память, которая удерживалась X?


person Kam    schedule 21.10.2012    source источник
comment
Это не относится к вашим непосредственным вопросам, но это не операция заполнения. Это присваивание элементам списка. В случае, если список оставался пустым с момента его создания, он также не работает.   -  person Luc Danton    schedule 21.10.2012


Ответы (2)


И да и нет. Будет вызван деструктор каждого элемента. Однако это не приведет к желаемому эффекту. Элементы имеют тип X*, поэтому будет вызываться деструктор X* (который ничего не делает для типа указателя), а не деструктор X, который вам нужен. Вам нужно явно удалить свои элементы. В общем, если у вас в коде есть new, то должен быть и соответствующий delete.

person SomeWittyUsername    schedule 21.10.2012
comment
Большое спасибо! Хорошо, глупый вопрос, можно ли как-то перегрузить деструктор X*? - person Kam; 21.10.2012
comment
@Kam Нет, и ты тоже не хочешь этого делать. - person ; 21.10.2012
comment
@Kam, интеллектуальные указатели обеспечат вызов деструкторов вашего объекта, когда вызывается интеллектуальный указатель. - person chris; 21.10.2012
comment
@chris, спасибо, да, я знаю, и на самом деле это то, чем я сейчас занимаюсь, я только хотел понять поведение. Я просто как-то ошибочно предположил, что деструктор указателя на объект вызовет деструктор этого объекта. - person Kam; 21.10.2012

В стандартной библиотеке C++ контейнер является единственным владельцем содержащихся в нем элементов, поэтому при уничтожении контейнера уничтожаются все элементы.

Однако обратите внимание, что «уничтожение» голого указателя в C++ не является операцией, поэтому элемент, на который указывает указатель, не будет удален (голый указатель может указывать на статически выделенные данные или на данные, принадлежащие какому-либо другому контейнеру).

Что вы можете сделать, так это создать либо std::list элементов (вместо указателя на элементы), либо (в случае, если вам нужен указатель, например, из-за полиморфизма), вместо этого вы можете использовать интеллектуальные указатели, которые могут заботиться об указанных элементах. если вам так нравится.

person 6502    schedule 21.10.2012