C++ new和malloc的區別

這里先對new和delete簡單進行一下總結,然后再細說new和malloc的區別。

一、new和delete
C語言提供了malloc和free兩個系統函數,完成對堆內存的申請和釋放。而C++則提供了兩個關鍵字new和delete;

1.1 規則

  • new/delete是關鍵字,效率高于malloc和free。
  • 配對使用,避免內存泄漏和多重釋放。
  • 避免交叉使用,比如malloc申請空間delete釋放,new出的空間被free。
  • new/delete 主要是用在類對象的申請和釋放。申請的時候會調用構造器完成初始化,釋放的時候,會調用析構器完成內存清理。

1.2 new/new[] 用法

    //開辟單地址空間int *p = new int;  //開辟大小為sizeof(int)空間int *q = new int(5); //開辟大小為sizeof(int)的空間,并初始化為5。//開辟數組空間//一維int *a = new int[100]{0};//開辟大小為100的整型數組空間,并初始化為0。//二維int (*a)[6] = new int[5][6];//三維int (*a)[5][6] = new int[3][5][6];//四維及以上以此類推。

1.3 delete/delete[] 用法

    //釋放單個int空間int *a = new int;delete a;//釋放int數組空間int *b = new int[5];delete []b;

二、new和malloc的區別

2.1 屬性
new和delete是C++關鍵字,需要編譯器支持;malloc和free是庫函數,需要頭文件支持。

2.2 參數
使用new操作符申請內存分配時無須指定內存塊的大小,編譯器會根據類型信息自行計算。而malloc則需要顯式地指出所需內存的尺寸。

2.3 返回類型
new操作符內存分配成功時,返回的是對象類型的指針,類型嚴格與對象匹配,無須進行類型轉換,故new是符合類型安全性的操作符。而malloc內存分配成功則是返回void * ,需要通過強制類型轉換將void*指針轉換成我們需要的類型。

2.4 自定義類型
new會先調用operator new函數,申請足夠的內存(通常底層使用malloc實現)。然后調用類型的構造函數,初始化成員變量,最后返回自定義類型指針。delete先調用析構函數,然后調用operator delete函數釋放內存(通常底層使用free實現)。

malloc/free是庫函數,只能動態的申請和釋放內存,無法強制要求其做自定義類型對象構造和析構工作。

2.5 “重載”
C++允許自定義operator new 和 operator delete 函數控制動態內存的分配。

2.6 內存區域
new做兩件事:分配內存和調用類的構造函數,delete是:調用類的析構函數和釋放內存。而malloc和free只是分配和釋放內存。

new操作符從自由存儲區(free store)上為對象動態分配內存空間,而malloc函數從堆上動態分配內存。自由存儲區是C++基于new操作符的一個抽象概念,凡是通過new操作符進行內存申請,該內存即為自由存儲區。而堆是操作系統中的術語,是操作系統所維護的一塊特殊內存,用于程序的內存動態分配,C語言使用malloc從堆上分配內存,使用free釋放已分配的對應內存。自由存儲區不等于堆,如上所述,布局new就可以不位于堆中。

2.7 分配失敗
new內存分配失敗時,會拋出bac_alloc異常。malloc分配內存失敗時返回NULL。

2.8 內存泄漏
內存泄漏對于new和malloc都能檢測出來,而new可以指明是哪個文件的哪一行,malloc確不可以。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444190.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode620. 有趣的電影(SQL)

某城市開了一家新的電影院,吸引了很多人過來看電影。該電影院特別注意用戶體驗,專門有個 LED顯示板做電影推薦,上面公布著影評和相關電影描述。 作為該電影院的信息部主管,您需要編寫一個 SQL查詢,找出所有影片描述為…

leetcode1050. 合作過至少三次的演員和導演(SQL)

ActorDirector 表: ---------------------- | Column Name | Type | ---------------------- | actor_id | int | | director_id | int | | timestamp | int | ---------------------- timestamp 是這張表的主鍵. 寫一條SQL查詢語句獲取合作…

linux內核相關知識

參考https://www.cnblogs.com/xdyixia/p/9248240.html linux內核啟動過程 一個嵌入式 Linux 系統從軟件角度看可以分為四個部分:引導加載程序(Bootloader),Linux 內核,文件系統,應用程序。其中 Bootloade…

棧與堆的區別(內存分配與數據結構)

參考自https://blog.csdn.net/K346K346/article/details/80849966/ 堆(Heap)與棧(Stack)包含兩層含義: 程序內存布局場景下的內存管理方式數據結構中的兩種常見的數據結構 1. 程序內存分配中的堆與棧 1.1 棧介紹 …

leetcode10. 正則表達式匹配 一道沒有解釋的字符串dp困難題

給你一個字符串 s 和一個字符規律 p,請你來實現一個支持 . 和 * 的正則表達式匹配。 . 匹配任意單個字符 * 匹配零個或多個前面的那一個元素 所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。 說明: s 可能為空,且只包含…

string相關庫函數

char *strcat(char *dest, const char *src) 功能 把 src 所指向的字符串追加到 dest 所指向的字符串的結尾。 參數: dest – 指向目標數組,該數組包含了一個 C 字符串,且足夠容納追加后的字符串。 src – 指向要追加的字符串,該…

leetcode44. 通配符匹配 又是一道沒有解釋的字符串dp困難題

給定一個字符串 (s) 和一個字符模式 (p) ,實現一個支持 ? 和 * 的通配符匹配。 ? 可以匹配任何單個字符。 * 可以匹配任意字符串(包括空字符串)。 兩個字符串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫…

深入學習卷積神經網絡(CNN)的原理知識

轉載自https://www.cnblogs.com/wj-1314/p/9754072.html 在深度學習領域中,已經經過驗證的成熟算法,目前主要有深度卷積網絡(DNN)和遞歸網絡(RNN),在圖像識別,視頻識別,語…

java中如何生成隨機數?

java中如何生成隨機數? package com.test.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; public class CharacterUtils {/*** 第一種方法;length為產生的位數*/public static String getRandomString(int…

leetcode132. 分割回文串 II

給定一個字符串 s,將 s 分割成一些子串,使每個子串都是回文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個回文子串。 思路:dp[i]…

為什么需要智能指針

參考自https://www.cnblogs.com/round1/p/12906648.html 主要為了避免以下Bug: 內存泄露 :對象無法被釋放,最常見的問題。野指針 : 指針指向未知。重復釋放 : 顧名思義。 (一)內存泄露 : 1. 拋出異常&…

leetcode1068. 產品銷售分析 I(SQL)

銷售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- (sale_id, year) 是銷售表…

多進程與多線程通信同步機制

多進程通信方式 管道pipe:管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。命名管道FIFO:有名管道也是半雙工的通信方式,但是它允許無親緣關…

leetcode1069. 產品銷售分析 II(SQL)

銷售表:Sales -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是這個表的主鍵。…

leetcode1070. 產品銷售分析 III(SQL)

銷售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是此表的主鍵。 …

C/C++中static的用法全局變量與局部變量

轉載自C/C中static的用法全局變量與局部變量 1.什么是static? static 是C/C中很常用的修飾符,它被用來控制變量的存儲方式和可見性。 1.1static的引入 我們知道在函數內部定義的變量,當程序執行到它的定義處時,編譯器為它在棧上分配空間&…

查看商品圖片,鼠標懸浮圖片放大js實現

2010-06-07 10:18:46|分類&#xff1a;Javascript|字號訂閱 <%pagelanguage"java"import"java.util.*"pageEncoding"UTF-8"%> <%pageimport"com.pojo.Products"%> <% String path request.getContextPath(); String b…

leetcode547. 朋友圈

班上有 N 名學生。其中有些人是朋友&#xff0c;有些則不是。他們的友誼具有是傳遞性。如果已知 A 是 B 的朋友&#xff0c;B 是 C 的朋友&#xff0c;那么我們可以認為 A 也是 C 的朋友。所謂的朋友圈&#xff0c;是指所有朋友的集合。 給定一個 N * N 的矩陣 M&#xff0c;表…

C++中volatile關鍵字

轉載https://blog.csdn.net/weixin_44363885/article/details/92838607 一、volatile介紹 volatile提醒編譯器它后面所定義的變量隨時都有可能改變&#xff0c;因此編譯后的程序每次需要存儲或讀取這個變量的時候&#xff0c;都會直接從變量地址中讀取數據。如果沒有volatile…

leetcode261. 以圖判樹

給定從 0 到 n-1 標號的 n 個結點&#xff0c;和一個無向邊列表&#xff08;每條邊以結點對來表示&#xff09;&#xff0c;請編寫一個函數用來判斷這些邊是否能夠形成一個合法有效的樹結構。 示例 1&#xff1a; 輸入: n 5, 邊列表 edges [[0,1], [0,2], [0,3], [1,4]] 輸…