这篇文章所述只是本人遇到的问题,仅供参考。

#include<list>
#include<iostream>using namespace std;class Foo
{
public:Foo(int i) {m_iData = i;}void setData(int i ) {m_iData = i;}int GetData() {return m_iData;}
private:int m_iData;
};
// 为了提高可读性,定义容器和迭代器的名字
typedef list<Foo*> FooList;
typedef FooList::iterator FooListItor;void main()
{FooList c; // 创建一个链表容器//将三个不同的元素填入链表中c.push_back(new Foo(1));c.push_back(new Foo(2));c.push_back(new Foo(3));
//迭代遍历链表for(FooListItor itor = c.begin();itor != c.end();){if((*itor)->GetData() == 2){delete (*itor);itor = c.erase(itor);}else++itor;}//确保所有的对象被删除,链表不会自动完成该项任务
for(FooListItor itor2 = c.begin(); itor2 != end();++itor2)delete (*itor2);
}    

使用指针指向动态分配内存的结构或对象时,有几件事情需要注意。

1. 你要负责在使用完对象后释放所有分配的内存。容器并不知道将使用何种类型,所以它们不可能帮你自动释放内存。

2. 许多运算可能会失败,这是因为它们直接对对象或结构的指针进行操作,而不是对对象或结构本身。比如链表的sort()函数,它使用<运算符来比较值并以此结果进行排序。就算运算符对类Foo是合法的,但链表的排序仍是按照指针的实际值而不是对象中数据的值。因而有必要设计自己的比较运算符,在比较之前先对指针解引用。

3.记住,复制容器时,复制的仅仅是指针而不是对象。如果产生了重复的指针,将极难确定哪一个对象需要删除。解决办法是使用智能指针(smart pointer),或避开容器间复制元素的STL的例程或算法。

4.注意,在迭代遍历链表的时候,从链表中删除元素要非常小心。因为删除当前指向的元素将导致迭代器失效,所以你必须确保正确使用erase()函数的返回值,它是这个函数将检索出的容器中的下一个合法位置,通过将这个返回值分配给老的迭代器,我们就跳过了非法位置。但是这又给我们带来了新的问题。当for循环在循环结束处试图对迭代器递增,由于我们已经用erase()将迭代器递增到了下一个位置,因此就会出现问题。为了解决这个问题,我们将递增运算从for循环体移到了循环中的条件选择语句内,在元素没有删除时才进行递增。(一般来说,最好使用算法从容器中删除元素,而不是手工迭代来做,如算法remove_if()就能安全有效地进行该项操作)。

转载于:https://www.cnblogs.com/ll-10/p/5461481.html

STL : List使用时应注意的问题相关推荐

  1. select函数使用时应注意的问题

    问题一:fd_set和timeval的重置. select函数的使用一般分为以下几步 1.FD_ZERO(fd_set*); 2.FD_SET(int fd,fd_set*); 3.int selec ...

  2. 关于lm393使用时的一些注意

    电压比较器常用作矩形波的产生与波形的变换,可将一些周期性的波形转换成同频率的矩形波.下面简要讨论使用电压比较器lm393一些值得注意的地方. 1.输出需要加上拉电阻 图1.lm393的原理图 如图1为 ...

  3. 2022年5月视频用户洞察:用户使用时长增长 平台降本增效初见成效

    目前中国移动视频领域活跃用户数据呈现波动稳定的态势,据易观千帆数据,5月中国移动视频活跃用户数达到9.63亿人,相比上月略微回落:而用户使用时长实现三个月持续增长,达到714.77亿小时,成为近一年内 ...

  4. 前端 重构时需要注意的事项_驾驶式扫地车的功能特点和使用时需要注意事项...

    扫地车 随着经济的发展,人们的生活水平不断提高,对生活环境的要求也越来越高,于是许多工厂.物业.超市.社区.市政单位等开始购买扫地车来进行路面清洁.一是清洗效果好,二是效率高,可以节省人工成本.扫地车 ...

  5. 有没搞错?Java 对象不使用时要赋值为 null?

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 许多Java开发者都曾听说过"不使用的对象应手动赋 ...

  6. 场效应管的判别、检测及使用时的注意事项!

    一.用指针式万用表对场效应管进行判别 1)用测电阻法判别结型场效应管的电极 根据场效应管的PN结正.反向电阻值不一样的现象,可以判别出结型场效应管的三个电极.具体方法:将万用表拨在R×1k档上,任选两 ...

  7. 有没有搞错?Java 对象不使用时,要赋值为 null?

    来源 | olarxiong.com/category/java/ 前言 最近,听粉丝讨论说,"不使用的对象应手动赋值为null" 这句话,而且好多开发者一直信奉着这句话:问其原因 ...

  8. Java中当对象不再使用时,不赋值为null会导致什么后果 ?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | zhantong 来源 | https://w ...

  9. 当对象不再使用时,不赋值为 null 会导致什么后果?

    前言 许多Java开发者都曾听说过"不使用的对象应手动赋值为null"这句话,而且好多开发者一直信奉着这句话:问其原因,大都是回答"有利于GC更早回收内存,减少内存占用& ...

最新文章

  1. Dreamweaver xerces panic error 错误提示。
  2. 2019中国计算机高引学者榜单出炉,164人入选!
  3. .yaml 文件格式简介
  4. python 测试框架之---testtools
  5. android 判断进程是否处于前台
  6. HTTP_响应消息_响应头
  7. redis源码剖析(三)——基础数据结构
  8. php输出mysql的数据结构_php课程 13-43 mysql的数据结构是什么
  9. 通过Keepalived实现Redis Failover自动故障切换功能
  10. 公众号的秘密,知道一个biz就够了
  11. ES面试基础知识要点
  12. 极简代码(六)—— 返回 0/1 构成的布尔向量
  13. js系列:时间格式转成时间戳和比较某个时段是否在另一个时间段内
  14. centos服务器磁盘清理
  15. Linux 流量监控
  16. tolower c语言,tolower_字符串 | Strings_C_参考手册_非常教程
  17. 2月面经:真可惜...拿了小米的offer,字节却惨挂在三面
  18. EI收录的中国(中文)期刊(2022版)
  19. 洛谷P1603 斯诺登的密码 题解
  20. 【Verilog】inout 端口信号的使用

热门文章

  1. 90后的你,有什么赚钱方式?
  2. web安全这个行业的前景怎么样?
  3. ubuntu 安装docker
  4. 二叉树的层次遍历II
  5. 火狐浏览器使用copper插件无反应问题
  6. sql 表变量 临时表_SQL表变量概述
  7. SQL Server内联表值函数
  8. sql azure 语法_在Azure Data Studio中计划SQL笔记本
  9. t-sql执行结果_用于记录流程执行的T-SQL设计模式
  10. itest(爱测试) 3.3.7 发布,开源BUG 跟踪管理 敏捷测试管理软件