學完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...