1. 程式人生 > >面試題:C++有了malloc/free,為什麼還需要new、delete?

面試題:C++有了malloc/free,為什麼還需要new、delete?

1、面試寶典面試題(P81):C++有了malloc/free,為什麼還需要new、delete?

malloc與free是C、C++語言的標準庫函式,new/delete是C++的運算子。他們都用於申請動態記憶體和釋放記憶體。

對於非內部資料型別的物件而言,只用malloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行解構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制權限之內,不能夠把執行建構函式和解構函式的任務強加給malloc/free。 因此C++語言需要一個能完成動態記憶體分配和初始化工作的運算子new,以及一個能完成清理與釋放記憶體工作的運算子delete。new/delete不是庫函式而是運算子
malloc 是C語言的標準庫函式,它實現了在堆記憶體管理中進行按需分配的機制,但是它不提供在C++中
對像構造的支援,而new 則是一個 在C++中同時完成堆記憶體按需分配支援和對像構造功能的運算子
(我這麼理解,malloc只能分配動態記憶體,而new除了分配動態記憶體還能構造物件,free只能釋放記憶體,而delete除了釋放記憶體還能執行解構函式
我們不要企圖用malloc/free來完成動態物件的記憶體管理,應該用new/delete。由於內部資料型別的“物件”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。
3) 既然new/delete的功能完全覆蓋了malloc/free,為什麼C++不把malloc/free淘汰出局呢?這是因為C++程式經常要呼叫C函式,而C程式只能用malloc/free管理動態記憶體。

如果用free釋放“new建立的動態物件”,那麼該物件因無法執行解構函式而可能導致程式出錯。如果用delete釋放“malloc申請的動態記憶體”,結果也會導致程式出錯,但是該程式的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。
2、共享型智慧指標通過維護一個對資源的引用計數來實現多個智慧指標物件使用同一資源,每當資源上新增一個智慧指標物件的時候,引用計數就加1,智慧指標物件析構的時候,引用計數減1,當引用計數減為0的時候,釋放資源

相關推薦

試題C++malloc/free為什麼需要newdelete

1、面試寶典面試題(P81):C++有了malloc/free,為什麼還需要new、delete? malloc與free是C、C++語言的標準庫函式,new/delete是C++的運算子。他們都用於申請動態記憶體和釋放記憶體。 對於非內部資料型別的物件而言,只用mall

c++中malloc/free為什麼需要new/delete

一:malloc/free是c/c++中的標準庫函式,new/delete是c++中的運算子。它們都用於申請動態記憶體和釋放記憶體。二:對於非內部資料物件(eg:類物件),只用malloc/free無法滿足動態物件的要求。這是因為物件在建立的同時需要自動執行建構函式,物件在消

Hive試題hive哪些udf函式作用

UDF(user-defined function)作用於單個數據行,產生一個數據行作為輸出。(數學函式,字串函式) UDAF(使用者定義聚集函式 User- Defined Aggregation Funcation):接收多個輸入資料行,併產生一個輸出資料行。(count,max)

試題5——C中的mallocC++中的new什麼區別?

malloc和new有以下區別: (1)new,delete是操作符,只能在C++中使用; (2)malloc,free是函式,可以覆蓋,C,C++中都可以使用; (3)new可以呼叫物件的建構函式,對應的delete呼叫相應的解構函式; (4)malloc僅僅分配記憶體,free僅僅回收記

C++中malloc/free 為什麼還要new/delete

malloc 與free 是C++/C 語言的標準庫函式,new/delete 是C++的運算子。它們都可用於申請動態記憶體和釋放記憶體。 對於非內部資料型別(內部資料型別是編譯器本來就認識的,不需要使用者自己定義。 非內部資料型別不是編譯器本來就認識的,需要使用者自己定義

【轉載】試題“你能不能談談java GC是在什麼時候對什麼東西什麼事情?”

面試題目:  地球人都知道,Java有個東西叫垃圾收集器,它讓建立的物件不需要像c/cpp那樣delete、free掉,你能不能談談: GC是在什麼時候,對什麼東西,做了什麼事情?   以上算是三個問題,下面逐一分析: 問題一回答:什麼時候? 1.系統空閒的時候。

試題c++哪四個型別轉換相關的關鍵字?

在C/C++語言中用 (type) value(在C++還可以採用type(value))來進行顯式型別轉換(explicit type conversion),常常又被稱為強制轉換(cast投射/鑄模)。這種轉換的正確性完全掌握在程式設計師手中,傳統上強制轉換往往被過度使

試題“你能不能談談java GC是在什麼時候對什麼東西什麼事情?”

地球人都知道,Java有個東西叫垃圾收集器,它讓建立的物件不需要像c/cpp那樣delete、free掉,你能不能談談,GC是在什麼時候,對什麼東西,做了什麼事情?一.回答:什麼時候?1.系統空閒的時候。    分析:這種回答大約佔30%,遇到的話一般我就會準備轉向別的話題,譬如演算法、譬如SSH看看能否發掘

試題JQuery幾種選擇器?

很多種,大概歸納為9種。 (1)基本 #id element .class * selector1,selector2,selectorN (2)層次選擇器: ancestor descendant parent > child prev + next

試題陣列沒有length()方法? 字串沒有length()方法? 集合沒有length()方法?

陣列求長度用length屬性 字串求長度用length()方法 集合求長度用size()方法 程式舉例: package 集合.length_size; import java.util.ArrayList; import java.util.List; public

一道簡單的試題竟然90%的程式設計師不能把這個演算法完全寫正確。。。

前段時間,在論壇上看到有統計說有90%的程式設計師不能夠寫對簡單的二分法。二分法不是很簡單的嗎? 這難道不是聳人聽聞? 其實,

曹工說試題一個執行緒協同問題解法繁多都要被玩壞趁著沒壞一起玩吧

# 前言 最近兩個月寫文章很少,因為自己學習狀態也不是很好,我看了下,上一篇文章,都是一個月前了。 不知道大家有沒有感覺,小學初中讀的一些書,看的一些文章,到現在都印象深刻,反倒是高中學的知識,高考後就慢慢消散,直到遺忘。 我想說的是,記得初中學過魯迅的《藤野先生》,裡面有一段話,大意是:久了不聯絡,有

試題應用中很多jar包比如springmybatisredis等等各自用的日誌系統各異怎麼用slf4j統一輸出?

一、問題概述 如題所說,後端應用(非spring boot專案)通常用到了很多jar包,比如spring系列、mybatis、hibernate、各類連線資料庫的客戶端的jar包。可能這個jar包用的是logback、那個用的是log4j、那個又是log4j2, 這時候,怎麼才能保證各jar包的日誌都能輸

試題應用中很多jar包比如springmybatisredis等等各自用的日誌系統各異怎麽用slf4j統一輸出?

相同 如何 align 等等 version 試題 ava body jakarta 一、問題概述 如題所說,後端應用(非spring boot項目)通常用到了很多jar包,比如spring系列、mybatis、hibernate、各類連接數據庫的客戶端的jar包。可能這

【圖文詳細 】HDFS試題介紹Hadoop中RPC協議以及底層用什麼框架封裝的

用於將使用者請求中的引數或者應答轉換成位元組流以便跨機傳輸。 函式呼叫層:函式呼叫層主要功能是:定位要呼叫的函式,並執行該函式,Hadoop採用了java的反射機制和動態代理實現了函式的呼叫。 網路傳輸層:網路傳輸層描述了Client和Server之間訊息的傳輸方式,Hadoop採用了基

阿里試題FileInputStream 在使用完以後不關閉流想二次使用可以怎麼操作

FileInputStream 中有一個方法是open 方法呼叫的是本地的開啟檔案的方法,fileinputStream 就是通過這個方法來開啟檔案的,所以如果要重寫讀取這個檔案,不重新建立物件,那麼只要呼叫這個方法就可以了。 /** * Opens the specifie

C++細節 C++中的malloc/free new/delete

首先,malloc/free 是函式,new/delete是一個操作符 下面看一下malloc,free,realloc函式原型 (引用自C++ reference) malloc/free ,calloc,realloc malloc void* malloc

11. 微軟試題輸入一個單向連結串列輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標

題目:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標。 分析: 單鏈表只能向後遍歷,不能向前遍歷,尾指標好找,倒數第K個不能從尾指標向前找。 倒的不好找,正的好找,我們只需要知道連結串列的總長度,就可以知道正數第幾個節點(

一道試題請寫sql查詢出成績小於60的同學的姓名和平均分並按平均分排序

給出如下3張表,stu表、sc表和course表: /* Navicat MySQL Data Transfer Source Server         : db_fightLandlor Source Server Version : 50520 Source Ho

劍指offer試題求二叉樹的映象(遞迴迴圈解法及測試用例)

題目:給定二叉樹,將其變換為源二叉樹的映象。 二叉樹的定義如下: struct TreeNode {     int val;     TreeNode* left;     TreeNode* right; }; 輸入描述: 二叉樹的映象定義:     源二叉樹