请教如何释放vector容器中的指针?
例如下代码,如果删除容器中的指针后,应该如何释放呢?
struct Data
{
int xx;
int yy;
Data():xx(1),yy(2){}
};
std::vector<Data *> vItem;
Item *nItem = new Item();
nItem->id= GetId();
nItem->name= GetName();
vItem.push_back(nItem);
if (vItem.size() >= MAX_COUNT)
{
//执行一些操作后,清空容器,释放指针;
vItem.clear();
}
void clear() { erase(begin(), end()); }
iterator erase(iterator first, iterator last) {
iterator i = copy(last, finish, first);
destroy(i, finish);// 全局函数,销毁元素的基本函数。
finish = finish - (last - first);
return first;
}
// 以下是 destroy() 第二版本,接受两个迭代器。
// 这里用到了traits技术,判断型别,以便用不同的方式析构对象,不了解traits略过就可以
template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last) {
__destroy(first, last, value_type(first));
}
// 判断元素的数值型別(value type)是否有 trivial destructor
template <class ForwardIterator, class T>
inline void __destroy(ForwardIterator first, ForwardIterator last, T*) {
typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;
__destroy_aux(first, last, trivial_destructor());
}
// 如果元素的数值型別(value type)有 non-trivial destructor…对应与类,此时无法直接大块释放内存
// 当为内置数值如int等,可以直接大片释放内存来提高效率
template <class ForwardIterator>
inline void
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {
for ( ; first < last; ++first)
destroy(&*first); //这里是一个指针,也就是你容器中的元素
}
// 以下是 destroy() 一个版本,接受一個指针。
template <class T>
inline void destroy(T* pointer) {
pointer->~T();// 使用析构函数,
}
class Test
{
public:
Test() {}
~Test() { cout << "Test des" << endl; }
};
int main()
{
vector<Test*> vec;
vec.push_back(new Test());
vec.push_back(new Test());
vec.push_back(new Test());
vec.clear();
return 0;
}