首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问怎么释放vector容器中的指针

2013-04-07 
请教如何释放vector容器中的指针?例如下代码,如果删除容器中的指针后,应该如何释放呢?struct Data{int xx

请教如何释放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就知道了。
[解决办法]
引用:

for(i = 0; i < vItem.size(); i++)
   delete vItem[i];

++
[解决办法]
引用:
#1答案+1
#2太理想主义了,试试下面的代码,看有几个编译器能正确调用析构函数?
C/C++ code?12345678910111213141516class Test{public:    Test() {}    ~Test() { cout << "Test des" << endl; }}; int main(){    vector<Test*> vec……


验证了下子,还真不可以,看来我STL还没有学好。我只记得书上是这么说得。。。书用的是GCC和SGI。我用的VS6.0编译,没有自动调用。赐教了,谢谢。
[解决办法]
引用:
引用:#1答案+1
#2太理想主义了,试试下面的代码,看有几个编译器能正确调用析构函数?
C/C++ code?12345678910111213141516class Test{public:    Test() {}    ~Test() { cout << "Test des" << endl; }}; int main(){    ……

书上没说错
如果是 std::vector<Data>  vItem; 

就没问题了。

热点排行