STL中_Container_base_secure:Myfirstiterator为什么是public,该如何解决
STL中_Container_base_secure::_Myfirstiterator为什么是public我用的是 VS2008。看到 std::_Container_bas
STL中_Container_base_secure::_Myfirstiterator为什么是public
我用的是 VS2008。
看到 std::_Container_base_secure
中的 _Myfirstiterator 是public 的,表示不理解。
见以下代码
C/C++ codedeque<int>::iterator p; //声明一个全局迭代器 pvoid dosomething(){ deque<int> myDeque; myDeque.push_back(0); //压入一个元素0 p = myDeque.begin(); cout<<*p<<endl; //输出*p,没问题 myDeque._Myfirstiter = 0; //因为_Container_base_secure::_Myfirstiter是public的, //就可以直接就可以置0,这样太不安全了吧。}int main(){ dosomething(); if(p._Has_container()) {//此句判断成功,都是myDeque._Myfirstiter = 0;惹的祸,没有把p._Mycont置0 cout<<*p<<endl; //此句很有风险,因为原来dosomething()中的myDeque内存部分已经被置为不可用了 } system("pause"); //即时上面的cout<<*p可以侥幸运行,这里的对迭代器p的析构也会出问题。}
既然_Container_base_secure::_Myfirstiter为public可以因为这样的乱用
而造成隐患,它为啥还是 pulic 的呢?
我才学STL,不太理解,请前辈们指点指点。
[解决办法]想了想lz的代码,没有觉得有什么不安全的,理由如下。
_Myfirstiterator的含义是这个deque的第一个元素吧,本来deque里面的所有的元素你就是可以取出来的,如果你定义的不是const,值也是可以改变的,你自己定义一个iterator,然后指向这个值,然后再改这个值,跟你直接改deque里面的这个值,有什么本质的区别吗?我看是没有的。
另外一点是,lz不要觉得成员变量就一定是private的,这一点在stl reference那本书里面就写得比较清楚了,pair的实现就是用的struct,有些实现就是要用public的,因为没必要private。
不知道我答清楚没有
[解决办法]这种用法关键在于你怎么去控制了
正如deque中有front()成员函数(进行了重载),一个返回refrence,另外一个返回const_refrence
这个调用看你的控制,如果你用一个普通的refrence你就可以设置这个值,你调用第二个久只是只读了(这和你接受的变量的属性是否是const有关)
[解决办法]这些是需要你自己去控制的,就好比你要故意对end()返回的迭代器进行解引用一样.明知有风险确要去做.