Возможный дубликат:
Имеет ли 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*
таким образом, деструктор X*
будет вызван (который ничего не делает для типа указателя), а не деструктор X, который вам нужен. Вы должны явно удалить свои элементы. В общем, если у вас есть new
в вашем коде должен быть соответствующий delete
,
В дизайне стандартной библиотеки C ++ контейнер является единственным владельцем содержащихся элементов, поэтому при уничтожении контейнера все элементы уничтожаются.
Однако обратите внимание, что «уничтожение» пустого указателя в C ++ является операцией без операции, поэтому указанный элемент не будет удален (открытый указатель может указывать на статически размещенные данные или данные, принадлежащие некоторому другому контейнеру).
Что вы можете сделать, это создать std::list
элементов (вместо указателя на элементы) или (в случае, если вам нужен указатель, например, из-за полиморфизма), вы можете вместо этого использовать умные указатели, которые могут позаботиться о указанных элементах, если вам это нравится.