Да, вы можете доверять векторам, чтобы убирать за собой.
ОДНАКО Вы не можете доверять тому, что вектор вещей держит для очистки после себя. То, что нужно очистить, может быть чем-то, что сохраняется за пределами вашего приложения. Если его память, это не беспокойство. Если он удостоверится, что все теги XML закрыты, то ОС не сможет вам помочь.
Например, что, если у вас есть вектор какого-нибудь объекта Wankky Lock, например:
class CLock
{
public:
CLock() {}
~CLock() {}
void Lock(...) {...}
void Unlock(...) {...}
};
std::vector<CLock> myLockVec;
Как ваш вектор CLock's узнает, что разблокировать все, когда это будет сделано? Вектор не создан, чтобы знать о замках.
По сути, это та же самая ситуация, что и наличие вектора указателей:
std::vector<int*> myIntVec;
Как вектор знает, какие указатели здесь были удалены и имеют значение NULL, а какие на самом деле есть? Возможно, некоторые из них были удалены и установлены в ваше специальное значение 0xdeadbeef, что означает удаленный.
Дело в том, что вектор не имеет возможности узнать это или знать, что его элементы являются указателями или замками или чем-то еще. Они просто должны быть объектами, которые имеют конструкторы по умолчанию и являются копируемыми, и удовлетворяют другим таким требованиям, которые вектор предъявляет к своим элементам.
Решение состоит в том, чтобы быть уверенным, что любой вектор HOLDS должен отвечать за его очистку. Это называется RAII - Распределение ресурсов - Инициализация, более важно здесь, Уничтожение ресурсов - это Распределение. В приведенном выше примере с нашим CLock ответ очевиден, обязательно откройте его, когда закончите!
class CLock
{
...
~Clock()
{
if (locked)
{
Unlock();
}
}
}
Но с указателями это не так очевидно. Решение - заключить указатель в класс smart_ptr. Самыми плодовитыми из них являются бустерское семейство умных понитеров .
class CSmartPointer<T>
{
CSmartPointer( T* rawPtr)
{
m_ptr = rawPtr;
}
~CSmartPointer()
{
delete m_ptr;
}
}
Дополнительные функции включены в игру с указателями, такими как подсчет ссылок, но приведенный выше пример должен дать вам представление о природе проблемы и о том, как она обычно решается.