動態記憶體管理常見面試題

2021-08-31 01:32:48 字數 1600 閱讀 6433

學完c語言動態記憶體管理 和 c++動態記憶體管理我們就應該深入的去對比和了解兩個的特性。

共同點:都是從堆上開闢空間,最後都需要手動釋放

不同點:

malloc/delete是標準庫函式,new/delete是操作符

new建立物件時會呼叫建構函式+開空間 ;delete會呼叫析構函式,而malloc/free只會開空間,而不會呼叫建構函式和呼叫析構函式

malloc/free需要手動計算型別大小且返回值是 void*,在使用時必須強轉 ,而new/delete可以自動計算空間並且返回對應型別的指標。

malloc申請空間失敗時返回null,因此在申請完之後必須判空,new不需要,但是new有出錯會有異常捕獲

malloc申請的空間一定在堆上,new不一定(也有可能會在棧上),因為operator new函式可以重新實現

new/delete比malloc/free效率要低,因為new/delete底層封裝的是malloc/free。

分析:我們在用在函式內部定義變數----是在棧上開闢空間,若在全域性區建立變數------則在資料段開闢空間

我們唯一知道能在堆上建立變數只有malloc相關函式,但是,malloc不會呼叫建構函式,pass。

那麼我們到底要怎麼做呢?

1.將建構函式作為私有成員,拷貝構造申明為私有成員,防止其他人呼叫在棧上建立物件

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

class test

private:

//將建構函式申明為私有

test() {};

//防拷貝,但是這樣是存在乙個缺陷的,如果類中有friend函式該做法就會失效

//這裡我們只宣告,不實現。因為實現可能會很麻煩,而我們本身可能不需要

test(const test&t);

//c++11提供的完美解決辦法----刪除函式

這個就比較簡單了,只能在棧上建立物件,即不能再對上建立物件,這樣的話我們只需要將new的功能遮蔽掉即可,當然operator new 和 定位new表示式也會隨之遮蔽。

class stacktype

void print()

private:

stacktype()

{} //將operator new 和 定位new表示式 功能遮蔽

C 動態記憶體常見面試題解析

malloc free和new delete傻傻分不清?動態記憶體管理的面試題難道你了?來看這篇文章,包你全會。1 malloc free是函式,new delete是操作符 2 malloc free不會呼叫構造 析構函式,new delete會呼叫構造 析構函式 3 malloc申請的空間不能初...

面試題 動態記憶體管理

1.malloc void malloc size t size 用來向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標 1 開闢成功,返回乙個指向開闢好空間的指標 開闢失敗,返回乙個null指標,因此malloc的返回值一定要用assert檢查 2 返回值是void 所以malloc函式並不...

c 記憶體管理常見面試題

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