std::vector<T>
действительно вызывает деструктор T
, когда он уничтожен.Здесь T
равно int *
.Деструктор int *
ничего не делает.Память для int *
сама по себе освобождается, но int
s, на которые они указывают, не являются.
Обратите внимание:
int main() {
int *x = new int(23);
return 0;
}
Это демонстрирует ту же проблему;когда x
выходит из области видимости, его деструктор действительно вызывается, и хранилище для указателя , который является x
, освобождается, но, поскольку деструктор указателя является неоперативным, указывает на int
не освобожден.
Более того, vector
не знает, как были выделены int
s.Они могут быть выделены на new int
, но они также могут указывать на элементы внутри массива, выделенного с new int[200]
, или они могут указывать на данные malloc
d, или они могут указывать на буфер mmap
',или они могут указывать на элементы структуры, или два вектора могут указывать на одни и те же int
s ... и т. д. vector
недостаточно умен, чтобы предугадать, что вы хотите сделать с ними, и поэтому он оставляет их в покое (Кроме того, если предоставить vector
логику для удаления указанных элементов, это приведет к разрыву векторов не указательных элементов, таких как std::vector<int>
, так как вы не можете delete
и int
!)
.либо используйте std::vector<int>
, либо используйте умный указатель вместе с ним, например std::vector<boost::shared_ptr<int> >
.Обратите внимание, что использование умных указателей может увеличить накладные расходы;с C ++ 0x вы сможете использовать std::vector<std::unique_ptr<int>>
в сочетании с std::move
, чтобы избежать этих издержек.Boost также имеет вектор-указателей , которые освобождают элементы, на которые указывают, как вы и ожидали.