关闭

C++ 存储指针的容器删除元素

标签: C++memoryvector
23人阅读 评论(0) 收藏 举报
分类:

假设需要用vector等容器存储指针,形如vector<typename *>,在删除元素的时候,仅仅使用erase改变了容器的存储,却没有释放指针所指向的内存,一不小心就造成了内存溢出。
故,我们需要在erase的同时释放内存。

template<typename T>
void deleteObject(T *obj){
    delete obj;
    obj = NULL;
}

class Base{
    static int count;
public:
    Base() { count++; cout<<"Base(): "<<count<<endl; }
    ~Base() { cout<<"~Base(): "<<count<<endl; count--; }
};

int Base::count = 0;

int main(){
    vector<Base*> elements;
    elements.push_back(new Base());
    elements.push_back(new Base());
    elements.push_back(new Base());

    while(!elements.empty()){
        vector<Base*>::iterator it = elements.end();
        elements.erase(--it);  // not call destruction function.
        deleteObject(*it);    // call destruction function.
    }
    return 0;
}
/*
Base(): 1
Base(): 2
Base(): 3
~Base(): 3
~Base(): 2
~Base(): 1
*/
0
0
查看评论

C++ 容器中存入”指针“及对象析构问题

[转]C++ 容器中存入”指针“及对象析构问题  (2012-09-20 23:32:20) 转载▼ 标签:  杂谈 分类: C相关 【转自】:http://blog.sina.com.c...
  • jfkidear
  • jfkidear
  • 2014-02-18 11:28
  • 7456

Ineffective C++(1):STL容器不仅仅可以保存指针

前言        在公司这两年没少带新人,有刚毕业的,也有工作了两三年的。除了要把公司项目的一些知识告诉他们,通常了需要review一下他们的代码。发现很多人在C++的基本概念上存在错误或者偏差,或者某种习惯用法有瑕疵。这些问题千奇百怪,...
  • yanonsoftware
  • yanonsoftware
  • 2006-09-19 17:59
  • 2520

C++顺序容器删除元素时的一个小陷阱(C++ primer第四版习题9.26)

C++顺序容器的一个小陷阱,vector容器和list容器迭代器失效等问题。C++ primer第四版习题9.25
  • bing_bing304
  • bing_bing304
  • 2015-03-17 21:00
  • 787

c++ STL 常用容器元素类型相关限制 指针 引用

转自: http://www.cnblogs.com/my_life/articles/4044921.html c++ 的 STL 中主要有 vector , list, map, set  , multimap,multiset     这些容器完全支持使...
  • Helloguoke
  • Helloguoke
  • 2016-09-22 16:58
  • 1106

C++迭代器在删除元素后的失效问题

C++迭代器失效问题__map/set等关联容器如何删除元素__vector/list/deque等序列容器如何删除元素__迭代器如何使用   序列性容器::(vector和list和deque)          erase迭...
  • WMJ75617718
  • WMJ75617718
  • 2014-02-11 23:00
  • 1617

【C++】vector容器和list容器中使用单个迭代器的erase函数学习笔记

例题为:假设有如下ia的定义,ia复制到vector和list中,把list容器中奇数值元素删除掉,把vector容器偶数值元素删除掉。 数组复制采用push_back操作。删除操作采用了erase函数,由于该函数返回值为指向被删除元素后面的元素,则使用了返回值赋值回给迭代器的方法,对迭代器进行前移...
  • qazcxh
  • qazcxh
  • 2015-04-11 16:07
  • 1293

c++容器存放不同结构的数据

本来想在c++容器里面存放不同的结构体,但是没有实现,最后通过子类父类的互相转换实现。 只要将建立一个基类的容器就可以直接push子类,这样就实现了一个可以用插入不同数据结构的容器。 1、将不同的结构体写成同一个基类派生的子类,在子类中添加自己希望的数据类型。 Test.h class ...
  • cxc233
  • cxc233
  • 2017-08-27 01:04
  • 357

STL-set (集合)之删除元素

set概述 和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。  在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做...
  • hurmishine
  • hurmishine
  • 2016-11-10 21:25
  • 4695

浅谈C++容器

Original URL: blog.csdn.net/acosoft 在面向对象的语言中,大多引入了容器的概念。那么 什么 是 容器?实质上就是一组相同类型对象的集合,但是它又不仅仅像数组那样简单,它实现了比数组更复杂的数据结构,当然也实现了比数组更强大的...
  • u012543266
  • u012543266
  • 2013-12-18 23:05
  • 1176

C++ STL常用容器删除操作注意事項

C/C++程序员对STL 容器肯定不会陌生, 以下是对常用容器进行 erase 操作注意事项的总结:vectorvector 容器是用数组实现的, 它在内存是连续分布的.对它进行 insert 或 erase 操作涉及到对插入点或删除点后的元素进行移位, 所以插入点或删除点后的iterator 会...
  • u010090316
  • u010090316
  • 2017-04-19 20:24
  • 344
    个人资料
    • 访问:355946次
    • 积分:9155
    • 等级:
    • 排名:第2424名
    • 原创:578篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论