请教如何释放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();
}
[解决办法]
for(i = 0; i < vItem.size(); i++)
delete vItem[i];
[解决办法]
调用clear清楚容器中的指针的时候,系统会自动释放指针所指的对象,用不着程序员操作。就你的具体问题摘了段STL源码。注释过了,应该能看懂。
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();// 使用析构函数,
}[解决办法]
#1答案+1
#2太理想主义了,试试下面的代码,看有几个编译器能正确调用析构函数?
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;
}
__type_traits<T>在标准库中一般只是针对原生类型进行了特化,楼主没有显式提供特化,那么除非编译器能自动推断has_trivial_destructor?,否则就是内存泄露。能自动推断has_trivial_destructor的编译器,我只听过,还没用过。想必短期也不可能流行起来,看如今还有多少人在用vc6.0就知道了。
[解决办法]
++
[解决办法]
验证了下子,还真不可以,看来我STL还没有学好。我只记得书上是这么说得。。。书用的是GCC和SGI。我用的VS6.0编译,没有自动调用。赐教了,谢谢。
[解决办法]
书上没说错
如果是 std::vector<Data> vItem;
就没问题了。