程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中new與delete、malloc與free運用剖析

C++中new與delete、malloc與free運用剖析

編輯:關於C++

C++中new與delete、malloc與free運用剖析。本站提示廣大學習愛好者:(C++中new與delete、malloc與free運用剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中new與delete、malloc與free運用剖析正文


普通來講,在C/C++的面試時,關於new/delete和malloc/free這兩對的應用和差別常常被考核到,假如這類基本的成績都答不下去,估量很惆怅面試了。本文等於對new/delete和malloc/free這兩對的應用和差別較為簡略的剖析一下,供年夜家參考。

1、new和delete

new和delete是C++的運算符,用於靜態分派內存和釋放內存。

1.new表達式

尺度庫界說了operator new函數的幾個重載版本,沒有應用noexcept解釋的版本在內存分派掉敗時能夠會拋出bad_alloc異常,而應用了的不會拋出異常。

void* operator new ( size_t ); 
void* operator new[]( size_t );  
void* operator new ( size_t , const nothrow_t& ) noexcept; 
void* operator new[]( size_t , const nothrow_t& ) noexcept;

當我們應用new表達式時,現實履行了三步操作:

①.new表達式挪用下面的operator new(或許operator new[])的尺度庫函數,函數分派一塊足夠年夜的、原始的、未定名的內存空間以便存儲特定類型的對象(或許對象的數組)。
②.編譯器運轉響應的結構函數以結構這些對象,並為其傳入初始值。
③.對象被分派了空間並結構完成,前往一個指向該對象的指針。

關於operator new函數或許operator new[]函數來講,它的前往類型必需是void*,第一個形參的類型必需是size_t且該形參不克不及含有默許實參。當編譯器挪用operator new或許operator new[]函數時,會把存儲指定對象或許指定對象的數組所需的字節數傳給size_t形參。

2.delete表達式

尺度庫也界說了operator delete函數的幾個重載版本,noexcept解釋符表現在內存分派掉敗時前往空指針而不是拋出bad_alloc異常。

void operator delete ( void* ) noexcept; 
void operator delete[]( void* ) noexcept; 
void operator delete ( void* , const nothrow_t& ) noexcept; 
void operator delete[]( void* , const nothrow_t& ) noexcept; 

當我們應用delete表達式時,現實履行了兩步操作:

①.對指針所指的對象或許所指的數組中的元素履行對應的析構函數。
②.編譯器挪用operator delete(或許operator delete[])的尺度庫函數釋放內存空間。

關於operator delete函數或許operator delete[]函數來講,它們的前往類型必需是void,第一個形參的類型必需是void*。履行一條delete表達式將挪用響應的operator函數,並用指向待釋放內存的指針來初始化void*形參。

2、malloc和free

malloc和free是C/C++中的尺度庫函數,也是用於請求靜態內存和釋放內存。

void* malloc( size_t size ); 
void free( void* ptr ); 

malloc函數接收一個表現待分派字節數的size_t,前往指向分派空間的指針;假如分派掉敗,則前往空指針。free函數接收一個void*,它是malloc前往的指針的正本,free將相干內存返還給體系。留意:malloc函數其實不會挪用結構函數來初始化內存,free函數也不會主動挪用析構函數。

3、new和malloc、delete和free的差別

int *p1 = new int;   // 沒有初始化列表, 所以沒有初始化 
int *p2 = new int();  // 空初始化列表, 履行zero初始化, 所以初始化為0 
int *p3 = new int(3); // 非空初始化列表, 履行值初始化, 所以初始化為3 
// 注:關於沒有結構函數的內置類型,new會不會初始化在於有無初始列表(空列表“()”也算) 
int *p4 = new int[100];   // 分派年夜小為sizeof(int)*100; 
 
int *p5 = (int*)malloc(sizeof(int)*128); 
double *p6 = (double*)malloc(sizeof(double)*12); 

new和malloc的差別:

①.new是一個運算符,malloc()是一個庫函數。

②.new會挪用結構函數,而malloc()不會。

③.new前往指定類型的指針,而malloc()前往void*。

④.new會主動盤算須要分派的空間,而malloc()須要手工盤算字節數。

⑤.new可以被重載,而malloc()不克不及。

delete p1; 
delete [] p2; 
free(p3); 
free(p4);

delete和free的差別:

①.delete是一個運算符,free()是一個庫函數。

②.delete會挪用析構函數,而free()不會。

③.delete可以被重載,而free()不克不及。

總結:

malloc和free是C/C++中的尺度庫函數,new和delete是C++的運算符。關於非內置數據類型的對象而言,光用maloc/free 沒法知足靜態對象的請求。對象在創立的同時要主動履行結構函數, 對象滅亡之前要主動履行析構函數。因為malloc/free 是庫函數而不是運算符,不在編譯器掌握權限以內,不克不及夠把履行結構函數和析構函數的義務強加malloc/free。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved