C 常見問題歸納(二)

2021-10-05 07:29:18 字數 3029 閱讀 4246

記憶體洩漏

·記憶體洩漏(memory leak):指由於疏忽或錯誤造成了程式未能釋放掉不再使用的記憶體的情況。記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。

·記憶體洩漏的分類:

堆記憶體洩漏(heap leak)。對記憶體指的是程式執行中根據需要分配通過malloc,realloc,new等從堆中分配的一塊記憶體,再是完成後必須通過呼叫對應的free或者delete刪掉。如果程式的設計的錯誤導致這部分記憶體沒有被釋放,那麼此後這塊記憶體將不會被使用,就會產生heap leak。

系統資源洩露(resource leak)。主要指程式使用系統分配的資源比如bitmap,handle,socket等沒有使用相應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能降低,系統執行不穩定。

沒有將基類的析構函式定義為虛函式。當基類指標指向子類物件時,如果基類的析構函式不是virtual,那麼子類的析構函式將不會被呼叫,子類的資源沒有正確是釋放,因此造成記憶體洩露。

stl迭代器刪除元素

序列容器 vector,deque:使用erase(itertor)後,後邊的每個元素的迭代器都會失效,但是後邊每個元素都會往前移動乙個位置,但是erase會返回下乙個有效的迭代器;

關聯容器map,set:使用了rase(iterator)後,當前元素的迭代器失效,但是其結構是紅黑樹,刪除當前元素的,不會影響到下乙個元素的迭代器,所以在呼叫erase之前,記錄下乙個元素的迭代器即可;

list:使用了不連續分配的記憶體,並且它的erase方法也會返回下乙個有效的iterator,因此上面兩種正確的方法都可以使用。

vector和list的區別

·概念:

vector:連續儲存的容器,動態陣列,在堆上分配空間。

底層實現:陣列。

兩倍容量增長:

vector 增加(插入)新元素時,如果未超過當時的容量,則還有剩餘空間,那麼直接新增到最後(插入指定位置),然後調整迭代器。

如果沒有剩餘空間了,則會重新配置原有元素個數的兩倍空間,然後將原空間元素通過複製的方式初始化新空間,再向新空間增加元素,最後析構並釋放原空間,之前的迭代器會失效。

效能:訪問:o(1)。

插入:在最後插入(空間夠)很快;在最後插入(空間不夠)需要記憶體申請和釋放,以及對之前資料進行拷貝;在中間插入(空間夠)記憶體拷貝;在中間插入(空間不夠)需要記憶體申請和釋放,以及對之前資料進行拷貝。

刪除:在最後刪除很快;在中間刪除記憶體拷貝。

適用場景:經常隨機訪問,且不經常對非尾節點進行插入刪除。

list:動態鍊錶,在堆上分配空間,每插入乙個元數都會分配空間,每刪除乙個元素都會釋放空間。

底層:雙向鍊錶。

效能:訪問:隨機訪問效能很差,只能快速訪問頭尾節點。

插入:很快,一般是常數開銷。

刪除:很快,一般是常數開銷。

適用場景:經常插入刪除大量資料。

·區別

①vector底層實現是陣列;list是雙向鍊錶。

②vector支援隨機訪問,list不支援。

③vector是順序記憶體,list不是。

④vector在中間節點進行插入刪除會導致記憶體拷貝,list不會。

⑤vector一次性分配好記憶體,不夠時才進行2倍擴容;list每次插入新節點都會進行記憶體申請。

⑥vector隨機訪問效能好,插入刪除效能差;list隨機訪問效能差,插入刪除效能好。

·應用①vector 擁有一段連續的記憶體空間,因此支援隨機訪問,如果需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector。

②list擁有一段不連續的記憶體空間,如果需要高效的插入和刪除,而不關心隨機訪問,則應使用list。

stl中map、multimap與unordered_map

·三者所有元素都是pair,同時擁有實值(value)和鍵值(key)。pair的第一元素被視為鍵值,第二元素被視為實值。

①map對映:所有元素都會根據元素的鍵值自動被排序。不允許鍵值重複。

底層實現:紅黑樹。

適用場景:有序鍵值對不重複對映。

②multimap多重對映:所有元素都會根據元素的鍵值自動被排序。允許鍵值重複。

底層實現:紅黑樹。

適用場景:有序鍵值對可重複對映。

③unordered_map對映:元素不會根據元素的鍵值排序。不允許鍵值重複。

底層實現:雜湊表。

適用場景:無序鍵值對不重複對映。

c++11有哪些新特性

auto關鍵字:編譯器可以根據初始值自動推導出型別。但是不能用於函式傳參以及陣列型別的推導。

nullptr關鍵字:nullptr是一種特殊型別的字面值,它可以被轉換成任意其它的指標型別;而null一般被巨集定義為0,在遇到過載時可能會出現問題。

智慧型指標:c++11新增了std::shared_ptr、std::weak_ptr等型別的智慧型指標,用於解決記憶體管理的問題。

初始化列表:使用初始化列表來對類進行初始化。

右值引用:基於右值引用可以實現移動語義和完美**,消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。

atomic原子操作用於多執行緒資源互斥操作。

⑦新增 stl容器array以及tuple

C 常見問題總結(二)

把ini.配置檔案字串中的伺服器名改成伺服器的,把debug資料夾拷到其他機器上就行,伺服器上的伺服器名是預設的話,改成ip,不是預設的話,改成伺服器上的sql server伺服器名 把前面的 去掉。裝到d盤,c盤也會佔很多地方,其他系統也是這樣 insert inro表1 id,name sele...

C 常見問題

1.預處理 預處理的主要作用就是對資源進行等價替換,最常見的預處理有 檔案包含 include 條件編譯 if,ifndef,ifdef,endif,undef 布局控制 pragma 巨集替換等 define 等。1.1 標頭檔案中放什麼?標頭檔案一般用於類的定義 extern變數和函式的宣告。由...

C 常見問題

問題描述 解決方式 無法解析的外部符號 public cdecl minidl operator operator void 0operator minidl qeaa xz 該符號在函式 public cdecl minidl denseop denseop void 0denseop minid...