當初寫日誌,只是為了記錄一下自己所做的事情,沒想到會有別人來看。所以沒有任何的解釋,只是胡亂寫了些東西。
其實問題很簡單,題目已經說明一切,錯誤就是越界,仔細檢查代碼,找出什麼地方可能會越界就行了
昨天運行程式時,突然出現了如題所述的錯誤。錯誤很明顯,vector的下標越界了,但是之前一直沒有什麼問題啊,於是我仔細讀代碼,debug,然後拿出前天能啟動並執行程式,依然會出現這個錯誤。
開始時不甘心,一直想著昨天之前都能運行,錯誤應該出在昨天的代碼裡面。
於是找啊找,找了一天終於還是沒有找到。
今天繼續找,不過今天已經不找昨天寫的代碼了,開始看看裡面調用的之前的函數,結果很短時間就找出來了,一個很低級的手誤。。。
總結:不能太相信自己,適當相信這些“標準”,畢竟是這麼多人總結出來,被更多的人用,提示這個錯誤就先找找這種錯誤
要更加仔細
要學會debug,寫完代碼多運行幾遍
另外,明白了vector裡面的at & [],源碼如下:
const_reference at(size_type _Pos) const<br />{// subscript nonmutable sequence with checking<br />if (size() <= _Pos)<br />_Xran();<br />return (*(begin() + _Pos));<br />}<br />reference at(size_type _Pos)<br />{// subscript mutable sequence with checking<br />if (size() <= _Pos)<br />_Xran();<br />return (*(begin() + _Pos));<br />}<br />const_reference operator[](size_type _Pos) const<br />{// subscript nonmutable sequence<br /> #if _HAS_ITERATOR_DEBUGGING<br />if (size() <= _Pos)<br />{<br />_DEBUG_ERROR("vector subscript out of range");<br />_SCL_SECURE_OUT_OF_RANGE;<br />}<br /> #endif /* _HAS_ITERATOR_DEBUGGING */<br />_SCL_SECURE_VALIDATE_RANGE(_Pos < size());<br />return (*(_Myfirst + _Pos));<br />}<br />reference operator[](size_type _Pos)<br />{// subscript mutable sequence<br /> #if _HAS_ITERATOR_DEBUGGING<br />if (size() <= _Pos)<br />{<br />_DEBUG_ERROR("vector subscript out of range");<br />_SCL_SECURE_OUT_OF_RANGE;<br />}<br /> #endif /* _HAS_ITERATOR_DEBUGGING */<br />_SCL_SECURE_VALIDATE_RANGE(_Pos < size());<br />return (*(_Myfirst + _Pos));<br />}
The difference between this member function and member operator function operator[] is that vector::at signals if the requested position is out of range by throwing an out_of_range exception. operator [] signals only if _HAS_ITERATOR_DEBUGGING.雖然不是太明白,但是應該是at()會檢查越界,而[]除了在這種debug時,是不會查越界的。所以我以後還是用.at()吧。不過 這樣會降低效率,還是[]在實際中應該會好些。一是簡單可讀,二是只在調試的時候查越界,調試完使用時不檢查,節約時間。不過好像c++ 0x會兩個都檢查了。不清楚,等待新標準