最近寫乙個併發的伺服器程式,乙個伺服器監聽多個埠.多個客戶端連線.
這麼多監聽的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...