Std::list iterator 的初始化和有效性判断

来源:互联网 发布:java开发框架是什么 编辑:程序博客网 时间:2024/06/06 00:58
 

最近在使用Std::list  的时候,程序偶尔会在iterator  进行比较的时候崩溃。Review代码发现iterator的内存为0xcdcdcdcd, 很显然内存地址越界了。所以对Std::list  iterator 的初始化和有效性的问题做了一些查找,很可惜没能搜集到多少有用的资料。

 

Comment: VS2008 下发现0xcdcdcdcd 为m_List.end();

 

std::list<CMyData *>::iterator it;

std::list<CMyData *> m_List;

 

1 初始化

1.1 it = m_List.end();

1.2  单独定义一个list <CMyData*>     sNull;
it=sNull.end();


2 有效性判断

这个问题比较麻烦,至今没有找到满意的方法。

 

2.1 对赋值后的

If(I t == m_List.end())

If(I t == sNull.end())

 

2.2 VS2005, 2008

判断   (it._Mycont   ==   sNull.end()._Mycont)即可,
如果(   it._Mycont   ==   sNull.end()._Mycont   )是真的话,表示it处于初始状态。

 

3 注意事项

3.1 尽量保证所比较的元素为iterator指向单个list中的元素;

3.2

3.2.1  Use   (your   list).end()   to   represent   an   invalid   iterator   into   your   list (1.1中所述);
3.2.2  Wrap   your   iterator   in   something   like   boost::optional
3.2.3  Use   an   additional   bool   variable   to   indicate   the   validity   of   your   iterator