vector的使用要注意

2021-04-15 03:21:37 字數 1344 閱讀 6459

最近寫乙個併發的伺服器程式,乙個伺服器監聽多個埠.多個客戶端連線.

這麼多監聽的socket,想到用socket儲存.自己寫了乙個類簡單封裝了底層的socket.在寫類的時候為了能正常用vector,必須要寫類的拷貝建構函式和過載等號運算子.但是在執行的時候select總是出現10038錯誤,這個錯誤是socket還沒有建立.socket指向的空間裡面沒有內容.反覆除錯尋找原因,原來是vector的機制問題.我還是沒有遵循它的規則.看來還是不能知道簡單的函式的功能就可以用,必須要了解它的機制,最好看源**,但是那樣有點難哦,呵呵!

原因是pushback()這個函式出現問題.我寫的建構函式是這樣的(縮減的).

class csocket

~csocket()

if( socket != ivalid_socket )

closesocket(socket);

socket socket;

我的開發工具是vs2005,vector的pushback先呼叫建構函式,建立乙個臨時的物件,然後再呼叫一些拷貝建構函式,最後函式完成之前,將所有的臨時構造的物件析構掉.要想用vector,對封裝的類必須要注意.不寫建構函式有時也編譯和執行過去,但是這是很不安全的.編譯器認為這是位拷貝,位拷貝會遇到記憶體越界的問題.這個我身有體會.

//最近在閱讀異常c++

一些vector的使用方法總結如下:

size():得到當前儲存的資料個數.resize():輸出後面的資料,保證當前的資料的數量.

capacity

則告訴你最少新增多少個元素才會導致容器重分配記憶體,而

reserve

在必要的時候總是會使容器的內部緩衝區擴充至乙個更大的容量,以確保至少能滿足你所指出的空間大小。這兩個函式僅對

vector

適用。

了解operator()

跟at()

之間的區別

。如果需要越界檢查

,請使用

at()

而不是operator()

。這麼做可以幫助我們節省大量的除錯時間。

sprintf()真的不是那麼方便使用,潛藏著很多不安全的因素.可能存在越界寫資料.

// 糟糕的主意:絲毫沒有改觀。 //

void prettyformat(int i, char* buf, int buflen) }

應該使用snprintf代替sprintf,保證緩衝區長度不越界.建議用std::stringstream

// 示例

3-2:

在c++

中進行字串化,使用

ostringstream

// void prettyformat(int i, string& s)

使用標準模板庫中的vector時需要注意的地方

stl中的vector用起來很方便,但是對其正確使用是使用方便的前提。根據c 的發明者bjarne stroustrup的忠告自我總結一下 vector的原型vector class std vector vector提供的資源 a vector是給程式設計師提供容器,可以容納其模板類的陣列 b v...

使用GetPixel要注意

今天遇到乙個問題,除錯了一天都沒有搞明白。任務是這樣的 將乙個bitmap放到乙個dc裡,然後獲取這個dc裡的某一點的rgb值。情況正如下 cfile file 用於讀取bmp檔案 bitmapfileheader bfhheader bmp檔案頭 bitmapinfoheader bmiheade...

使用GetPixel要注意

今天遇到乙個問題,除錯了一天都沒有搞明白。任務是這樣的 將乙個bitmap放到乙個dc裡,然後獲取這個dc裡的某一點的rgb值。情況正如下 cfilefile 用於讀取bmp檔案 bitmapfileheaderbfhheader bmp檔案頭 bitmapinfoheaderbmiheader b...