C 記憶體管理相關面試題

2021-09-30 16:42:27 字數 3019 閱讀 3411

1.malloc/free和new/delete的區別

malloc/free和new/delete的共同點是:都是從堆上申請空間,並且需要使用者手動釋放。不同的地方是:1.malloc和free是函式,new和delete是操作符2.malloc申請的空間不能初始化,而new可以初始化

3.malloc申請空間時,需要手動計算空間的大小並傳遞,new只需在其後跟上空間的型別即可

4.malloc的返回值是void*,在使用時必須強轉,new不需要,因為new後面跟的是空間的型別

5.malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常

6.malloc/free只能申請內建型別的空間,不能申請自定義型別的空間,因為其不會呼叫構造與析構函式,而new可以,new在申請空間後會呼叫建構函式完成物件的構造,delete在釋放空間前會呼叫析構函式完成空間中資源的清理

7.malloc申請的空間一定在堆上,new不一定,因為operator new函式可以重新實現

8.new/delete比malloc/free的效率稍微低點,因為new/delete的底層封裝了malloc/free

2.請設計乙個類,該類只能在堆上建立物件方法:建構函式私有化1.將類的建構函式私有,拷貝構造宣告為私有。防止別人呼叫拷貝在棧上生成物件

2.提供乙個靜態的成員函式,在該靜態成員函式中完成堆的建立

下面是**實現

#include using namespace std;

class heaponly

void print()

private:

heaponly()//建構函式私有化

{} //防止拷貝

heaponly(const heaponly&);

};int main()

3.請設計乙個類,該類只能在棧上建立物件方法:只能在棧上建立物件,既不能在堆上建立,因此只要將new的功能遮蔽掉即可,既遮蔽掉operator new和定位new表示式,注意:遮蔽了operator new,實際也將定位new遮蔽掉

#include using namespace std;

class stackonly

void print()

private:

void* operator new(size_t size);

void operator delete(void* p);

};int main()

4.單例模式(這個在面試中經常出現)這個在我的另一篇部落格有詳細介紹5.記憶體洩漏

1.什麼是記憶體洩漏

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

2.記憶體洩露的分類c/c++程式中一般我們關心兩種方面的記憶體洩漏

堆記憶體洩漏

堆記憶體指的是程式執行中依據需要分配通過malloc/calloc/realloc/new 等從堆中分配的一塊記憶體,用完後必須通過呼叫相應的free或者delete刪掉。假設程式的設計錯誤導致這部分記憶體沒有釋放,那麼以後這部分空間將無法再被使用,就會產生堆記憶體洩漏

系統資源洩漏

指程式使用系統分配的資源,比如套接字,檔案描述符,管道等沒有使用對應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能減少,系統執行不穩定

如何檢測記憶體洩漏在linux下記憶體洩漏檢測:

在windows下使用第三方工具:

其他工具:

如何避免記憶體洩漏

1. 工程前期良好的設計規範,養成良好的編碼規範,申請的記憶體空間記著匹配的去釋放。ps:這個理想狀 態。但是如果碰上異常時,就算注意釋放了,還是可能會出問題。需要下一條智慧型指標來管理才有保 證。2. 採用raii思想或者智慧型指標來管理資源。3. 有些公司內部規範使用內部實現的私有記憶體管理庫。這套庫自帶記憶體洩漏檢測的功能選項。4. 出問題了使用記憶體洩漏工具檢測。

ps:不過很多任務具都不夠靠譜,或者收費昂貴。

總結一下:記憶體洩漏非常常見,解決方案分為兩種:1、事前預防型。如智慧型指標等。2、事後查錯型。如洩漏檢測工具。

c 記憶體管理常見面試題

1 malloc free和new delete的區別 malloc和free和new delete的共同點是 都是從堆上申請空間的,並且需要使用者手動釋放。不同點 1 malloc和free是函式,new和delete是操作符 2 malloc申請的 空間不會被初始化,new可以初始化 3 mal...

記憶體分布及相關面試題

目錄 在c c 中記憶體分為5個區,分別為 堆區棧區對比 記憶體洩漏 malloc與new區別總結 在linux中的記憶體分布 棧區 指那些由編譯器在需要的時候分配,不需要時自動清除的變數所在的儲存區。如函式執行時,函式的形參以及函式內的區域性變數,返回值分配在棧區,函式執行結束後,形參和區域性變數...

iOS 記憶體管理面試題(記憶體布局)

記憶體布局 2 64bit和32bit下 long 和char所佔位元組是不同的 char 1位元組 ascii 2 256個字元 char 即指標變數 4個位元組 32位的定址空間是2,即32個bit,也就是4個位元組。同理64位編譯器為8個位元組 short int 2個位元組 範圍 2 2 即...