读书人

关于删除容器内容后泛型指针的指向解决

发布时间: 2012-03-05 11:54:03 作者: rapoo

关于删除容器内容后泛型指针的指向
#include <iostream>
#include <string>
#include <list>
using namespace std;

int main()
{
string st[5] = {"opensuse","debian","redhat","minix","windows"};
list<string> ilist(st,st+5);
list<string>::iterator it;

for (it = ilist.begin(); it != ilist.end(); it++)
cout << *it << "----";
cout << endl;
cout << *it << endl; //1

ilist.erase(ilist.begin(),ilist.end()); //2
cout << *it << endl; //3

return 0;
}

执行结果:
opensuse----debian----redhat----minix----windows----
opensuse
opensuse

一,泛型指针在结束FOR循环之后怎么接着指向了第一个元素(注释1)?
二,用ERASRE方法删除容器中所有元素之后,按我理解此时打印泛型指针指向的内容时应该出错,因为容器中已没有内容与泛型指针匹配。可是结果还是指向第一个元素(注释2,3)。为什么

[解决办法]
ilist.end();
是无效的,你去输出,结果不可预料.

我这里是直接挂了.
[解决办法]
可能是编译器的问题吧,for循环之后,it指向的应该是list最后一个元素的下一个位置,在没有使用的情况下,它应该是不确定的
使用erase删除之后它指向的是删除后的相应的下一个迭代器,
我用MinGW 在for循环和erase之后都出现了错误
如果揣测的话,或许跟内存分配有关系,比如,数组按由高到低进行存放,而list也是,这样,结果还是有可能像lz那样的
[解决办法]
楼主的编译环境是什么呢?
应该列出来
我的环境运行的情况如下:
vs.net 2003 + XP SP2
运行情况:
输出
opensuse----debian----redhat----minix----windows----
后无反应结束,符合常理

vs 6.0 + XP SP2
输出
opensuse----debian----redhat----minix----windows----
后程序出现异常挂掉,也是符合常理的啊

这样看来应该是编译器的实现各有不同吧
就是说编译器用的STL版本的具体实现不一样,
不毕为这种问题花心思

读书人网 >C++

热点推荐