欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中new與malloc的區(qū)別詳解

 更新時間:2023年10月30日 11:29:49   作者:大慶指針  
這篇文章主要介紹了C語言中new與malloc的區(qū)別詳解,new是運算符,可以用于動態(tài)分配,如果想要撤銷內(nèi)存使用delete,new運算符使用的一般格式為new類型,用new分配數(shù)組空間時不能指定初值,需要的朋友可以參考下

1.new的定義

new是運算符,可以用于動態(tài)分配。如果想要撤銷內(nèi)存使用delete。new運算符使用的一般格式為new類型,用new分配數(shù)組空間時不能指定初值。如果由于內(nèi)存不足等原因而無法正常分配空間,則new會返回一個空指針NULL,用戶可以根據(jù)該指針的值判斷分配空間是否成功。一般來說,使用new申請空間時,是從系統(tǒng)的“堆”(heap)中分配空間,申請所得的空間的位置時根據(jù)當時的內(nèi)存的實際使用情況決定的。但是,在某些特殊情況下,可能需要在程序員指定的特定內(nèi)存創(chuàng)建對象,這就是所謂的“定位放置new”(placement new)操作。例如:

int *p=new int(6);

2.malloc的定義

malloc的全稱是memory allocation,中文叫動態(tài)內(nèi)存分配,用于申請一塊連續(xù)的指定大小的內(nèi)存塊區(qū)域以void*類型返回分配的內(nèi)存區(qū)域地址,當無法知道內(nèi)存具體位置的時候,想要綁定真正的內(nèi)存空間,就需要用到動態(tài)的分配內(nèi)存,且分配的大小就是程序要求的大小。(來源百度百科)

void *malloc(int size);

3.new與malloc的區(qū)別

3.1屬性方面

new是關鍵字,需要編譯器支持;malloc是庫函數(shù),需要頭文件支持。

3.2參數(shù)方面

new申請內(nèi)存無需指定內(nèi)存大小,編譯器會根據(jù)類型信息自行計算。除此之外,new會調(diào)用構造函數(shù)。

int* p=new int;//分配大小為sizeof(int)的空間
int* p=new int(6);//分配大小為sizeof(int)的空間,并且初始化為6

malloc必須由我們計算需要申請的字節(jié)數(shù),需要顯式指出所需內(nèi)存的尺寸,并且返回后強行轉換為實際類型的指針。而且malloc只管分配內(nèi)存,并不能對所得的內(nèi)存進行初始化,所以得到的一片新內(nèi)存中,其值是隨機的。

int* p=(int)malloc(sizeof(int)100);//分配可以放下100個int的內(nèi)存空間

3.3處理數(shù)組方面

new有處理數(shù)組的new[],使用new[]分配的內(nèi)存必須使用delete[]進行釋放。

int* ptr=new int[100];//分配100個int的內(nèi)存空間

malloc要想動態(tài)分配一個數(shù)組的內(nèi)存,需要我們手動定義數(shù)組的大小。使用malloc分配內(nèi)存必須使用free來釋放內(nèi)存。

int* p=(int)malloc(sizeof(int)100);//分配可以放下100個int的內(nèi)存空間

3.4返回類型

new分配成功返回的是對象類型指針,與對象嚴格匹配,無類型轉換,所以new是符合類型安全性操作符;malloc返回值類型是void*,一般需要接強制類型轉換成我們需要的類型。

3.5分配失敗方面

new內(nèi)存分配失敗的時候,拋出bad_ alloc異常 ;malloc分配內(nèi)存失敗時返回NULL。

3.6自定義類型方面

new會先調(diào)用operator new函數(shù),申請足夠的內(nèi)存,然后調(diào)用類型的構造函數(shù),初始化成員變量,最后返回自定義類型指針。delete先調(diào)用析構函數(shù),然后調(diào)用operator delete函數(shù)釋放內(nèi)存。 malloc是庫函數(shù),只能動態(tài)地申請和釋放內(nèi)存,無法強制要求其做自定義類型對象構造和析構函數(shù)。

3.7重載方面

new可以重載,malloc不可以重載。 opeartor new /operator delete可以被重載。標準庫是定義了operator new函數(shù)和operator delete函數(shù)的8個重載版本,如下圖所示:

//這些版本可能拋出異常 
void * operator new(size_t); 
void * operator new[](size_t); 
void * operator delete (void * )noexcept; 
void * operator delete[](void *0)noexcept; 
//這些版本承諾不拋出異常 
void * operator new(size_t ,nothrow_t&) noexcept; 
void * operator new[](size_t, nothrow_t& ); 
void * operator delete (void *,nothrow_t& )noexcept; 
void * operator delete[](void *0,nothrow_t& )noexcept;

我們可以自定義上面函數(shù)版本中的任意一個,前提是自定義版本必須位于全局作用域或者類作用域中。

3.8內(nèi)存區(qū)域方面

new在自由儲存區(qū)分配內(nèi)存,malloc在堆上分配內(nèi)存。 自由存儲區(qū)(free store)是C++中通過new和delete動態(tài)分配和釋放對象的抽象概念,通過new來申請的內(nèi)存區(qū)域可稱為自由存儲區(qū),通過delete歸還內(nèi)存。特別的,new甚至可以不為對象分配內(nèi)存,定位new的功能可以做到這一點:

new (place_address) type

堆(heap)C語言和操作系統(tǒng)的術語,堆是操作系統(tǒng)所維護的一塊特殊內(nèi)存,它提供了動態(tài)分配的功能,當運行程序調(diào)用malloc()時就會從中分配,調(diào)用free()歸還內(nèi)存。 一般情況下,所有的C++編譯器默認使用堆來實現(xiàn)自由存儲,運算符new和delete內(nèi)部默認是使用malloc和free的方式來被實現(xiàn)。

3.9內(nèi)存泄漏方面

內(nèi)存泄漏對于new和malloc都能檢測出來,new可以明確指出是哪個文件的哪一行,但是malloc不可以明確指出是哪個文件的哪一行。

3.10效率方面

new是關鍵字,malloc是庫函數(shù),new的效率高于malloc。 new和malloc都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構造函數(shù),對象在消亡之前要自動執(zhí)行析構函數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權限之內(nèi),不能夠把執(zhí)行構造函數(shù)和析構函數(shù)的任務強加于malloc/free。 C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以及一個能完成清理與釋放內(nèi)存工作的運算符delete。所以說new的效率高于malloc。

4.總結

在這里插入圖片描述

到此這篇關于C語言中new與malloc的區(qū)別詳解的文章就介紹到這了,更多相關C語言new與malloc的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現(xiàn)通訊錄功能的流程與代碼

    C語言實現(xiàn)通訊錄功能的流程與代碼

    通訊錄是一個可以記錄親人、好友信息的工具,這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • QT實戰(zhàn)之打開最近文檔功能的實現(xiàn)

    QT實戰(zhàn)之打開最近文檔功能的實現(xiàn)

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)打開最近文檔功能,并實現(xiàn)基本的新建、打開、保存、退出、幫助等功能,感興趣的可以動手嘗試一下
    2022-06-06
  • C語言設計實現(xiàn)掃描器的自動機的示例詳解

    C語言設計實現(xiàn)掃描器的自動機的示例詳解

    這篇文章主要為大家詳細介紹了如何利用C語言設計實現(xiàn)掃描器的自動機,可識別的單詞包括:關鍵字、界符、標識符和常整型數(shù),感興趣的小伙伴可以了解一下
    2022-12-12
  • C++如何用智能指針管理內(nèi)存資源

    C++如何用智能指針管理內(nèi)存資源

    這篇文章主要介紹了C++如何用智能指針管理內(nèi)存資源,幫助大家更好的理解和使用c++開發(fā),感興趣的朋友可以了解下
    2020-08-08
  • C++標準庫介紹及使用string類的詳細過程

    C++標準庫介紹及使用string類的詳細過程

    C++中將string封裝為單獨的類,string?類是?C++?標準庫中的一個非常重要的類,用于表示和操作字符串,這篇文章主要介紹了C++標準庫介紹及使用string類,需要的朋友可以參考下
    2024-08-08
  • C語言kmp算法簡單示例和實現(xiàn)原理探究

    C語言kmp算法簡單示例和實現(xiàn)原理探究

    這篇文章主要介紹了C語言kmp算法簡單示例和實現(xiàn)原理探究,本文用簡潔的語言說明KMP算法的原理,并給出了示例,需要的朋友可以參考下
    2014-09-09
  • C++中的類與對象深度解析

    C++中的類與對象深度解析

    這篇文章主要為大家詳細介紹了C++中的類與對象,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++簡明圖解分析淺拷貝與深拷貝

    C++簡明圖解分析淺拷貝與深拷貝

    在c++中,深拷貝和淺拷貝也算是一個難點,特別是對于初學者來說,往往在不知道兩者區(qū)別的情況下而錯誤的使用了淺拷貝,從而導致了野指針之類的問題,但是又因為缺少理解所以很難定位到問題所在
    2022-06-06
  • Vue自定義指令最佳實踐教程分享

    Vue自定義指令最佳實踐教程分享

    Vue?3?顯著增強了自定義指令的功能,使其封裝更加靈活和易用,本文將分為基礎和進階兩部分,介紹如何實現(xiàn)常用的自定義指令,并提供最佳的項目組織方式,需要的朋友可以參考下
    2024-12-12
  • C/C++實現(xiàn)高并發(fā)http服務器的代碼示例

    C/C++實現(xiàn)高并發(fā)http服務器的代碼示例

    這篇文章簡單給大家介紹了C/C++實現(xiàn)高并發(fā)http服務器的代碼示例,文章通過代碼和圖文介紹的非常詳細,感興趣的同學可以參考閱讀
    2023-07-07

最新評論