當你決定用new來分配記憶體時,將承擔以下責任:
n 你必須確保以後會有人呼叫delete來刪除所分配的記憶體,否則將導致資源洩露。
n 你必須確保呼叫了正確的delete形式。比如單個物件呼叫delete;分配了陣列,則呼叫delete。
n 你必須確保只delete了一次。如果一次分配被多次delete,結果也是不確定的。
如果使用vector和string,則可以減少以上的擔憂。
如果你使用的string是以引用計數來實現的,而又在多執行緒的環境中,可以考慮以下幾種做法:
n 檢查庫實現,看看是否可以禁止引用計數。這種方法不可移植。
n 尋找或開發乙個不適用引用計數的string實現。
n 考慮使用vector而不是string,會丟失使用string的成員函式的機會,但可以通過stl演算法實現。
vector和的string的自動增長是這樣實現的:
n 當容器容量不足時,分配一塊大小為當前容量
+max
(當前容量,新增容量) 的新記憶體。大多數時候,都是每次以2的倍數增長,即容量需要擴張時,它們的容量加倍。
n 把容器的所有元素從舊的記憶體複製到新的記憶體。
n 析構掉舊記憶體中的物件
n 釋放舊記憶體
因此,容器的自動增長是會很耗時的。使用reserve能避免容器不必要的重複分配。主要有兩種方式:
n 若能確切知道或大概預計容器中最終會有多少元素,則可以使用reserve。
n 先預留足夠大的空間,然後,當把所有資料都加入以後,去除多餘的容量。可以考慮使用「swap技巧「(見17條)。
幾乎每個string實現都包含以下資訊:
n 字串的大小
n 用於儲存該字元中的字元的記憶體的容量
n 字串的值
n 它的分配子的乙個拷貝,這個欄位是可選的
n 對數的引用計數。
n string的值可能會被引用計數
n string物件大小的範圍可以是乙個char*指標的大小的1-7倍
n 建立乙個新的字串值可能需要零次,一次或兩次動態分配記憶體
n string物件可能共享,也可能不共享其大小和容量資訊。
n string可能支援,也可能不支援針對單個物件的分配子
n 不同的實現對字元記憶體的最小分配單位有不同的策略。
其實stl也有很多實現版本,每個版本的string實現都是不太一樣的。以後會再找乙個string實現原始碼具體分析。
vector和string的資料傳送到舊api方式:
n vector保證和陣列具有同樣的布局,可以直接把vector中的資料當做陣列來對待。&v[0]即陣列的首位址指標。反之亦然,可以將陣列元素直接複製到vector的記憶體位址。
n string提供c_str()函式來返回乙個指向字串的值的指標,且可用於c。因為string中的資料不一定是儲存在連續的記憶體中,而且不一定以空字元結尾。所以不能隨便修改指標指向記憶體的值,特意用顯式呼叫作為提醒。
n 對於其他型別的stl容器,可以將資料先拷貝到vector,用vector作為中介與舊api相互傳送資料
Web API 第二部分
web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...
redux 第二部分
redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...
實驗二 第二部分
第二部分 ftp協議分析 1.兩個同學一組,a和b。2.在a主機上架設ftp伺服器 3.在b主機上執行wireshark,並登陸a主機的ftp伺服器,上傳一張,得到抓取的資料報,4.進行追蹤tcp流,顯示為原始資料,分析得到a主機登陸ftp的過程及使用者名稱密碼,還原上傳的,第二部分 ftp協議分析...