侯老師--STL原始碼剖析--書中的疑問一 (轉)

worldblog發表於2007-12-09
侯老師--STL原始碼剖析--書中的疑問一 (轉)[@more@]

侯老師--STL原始碼剖析--書中的疑問一:namespace prefix = o ns = "urn:schemas--com::office" />

前言

我在看侯捷的STL原始碼剖析一書中”第一章Class的語法和語意(第30頁)”看到了如下的虛擬碼,我認為是有錯誤的,因為程式碼中在沒有初始化迭代子的情況下使用。程式碼如下:

狀態8:__STL_MEMBER_TEMPLATES

#include

using namespace std;

class alloc{

};

 

template

class vector{

public:

  typedef T value_type;

  typedef value_type* iterator;

 

  template

  void insert(iterator position, I first, I last)

{

    cout<

  }

};

 

int main()

{

int ia[5] = {0,1,2,3,4};

vector x;

vector::iterator ite;

x.insert(ite, ia, ia+5);  //insert()

}

  程式碼中加黑的行出現錯誤,當編譯執行時出錯,當然得把iterator和vector用STL庫中iterator和vector宣告來替換。還有主函式沒有返回值。替換後程式碼如下:

替換後程式碼

#include

#include

 

using namespace std;

 

int main()

{

int ia[5] = {0,1,2,3,4};

vector x;

vector::iterator ite;

x.insert(ite, ia, ia+5);  //insert()

retrun 0;

}

 

  出錯的原因是在定義ite時沒有初始化ite。當此型insert函式時(當然呼叫insert(int value)不會出錯,它不使用ite),它認為正確初始化了ite(ite此時為無效值,因為沒有初始化),所以當它向ite所指向的存放資料時出現訪問。當你在宣告vector::iterator ite時進行了正確的初始化就不會出錯了。

vector::iterator ite = x.begin();

  書寫此文可能有小題大作之嫌,這裡指的錯誤是不初始化指標,但在本例子沒有出現非法訪問,因為它根本就沒有使用ite。但是當我實際應用時,一定要注意初始化,千萬不要以為侯老師這麼寫,就照搬抄寫,那你一定會後悔的。作者只是重在語義,也可能是我理解錯誤。總之,此文僅供參考,如有錯誤還望來信指正,在下感激不盡。

 

  致謝!

            袁凱

           2001-11-09 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990072/,如需轉載,請註明出處,否則將追究法律責任。

相關文章