1. 程式人生 > >c++中的動態記憶體管理(new/delete)

c++中的動態記憶體管理(new/delete)

C++動態記憶體管理

  • 通過new/delete動態管理物件
  • 通過new[]/delete[]動態管理物件陣列
int *p1 = new int;    //動態分配4個位元組
int *p2 = new int(1);   //動態分配4個位元組,初始化為1
char *p3 = new char[3];  //動態分配3個位元組(3個char型別)

    delete p1;
    delete p2;
    delete[]p3;

注意:new/delete,和new[]/delete[]是匹配使用的。

  • c++的其他記憶體管理介面:
void *operator new(size_t size);
void
operator delete(size_t size); void *operator new[](size_t size); void operator delete[](size_t size);

1、operator new /operator delete/ oerator new[]/operator delete[]和malloc/free用法一樣
2、他們只負責分配空間/釋放空間,不會呼叫建構函式來初始化/解構函式來清理物件。
3、實際operator new 和 operator delete只是malloc 和free的一層分裝。

這裡寫圖片描述

  • new做了兩件事:

    1、呼叫operator new分配分配空間
    2、呼叫建構函式初始化物件

    這裡寫圖片描述

  • delete也做了兩件事:
    1、呼叫解構函式清理物件;
    2、呼叫operator delete釋放空間;
    這裡寫圖片描述

  • new[N]:
    1、呼叫operator new 分配空間;
    2、呼叫N次建構函式分別初始化每個物件

  • delete[]:
    1、呼叫N次解構函式清理物件
    2、呼叫operator delete釋放空間。

new/delete和malloc/free的區別

  • 相同點:
    malloc/free與new/delete都可以用於申請動態記憶體和釋放記憶體。且所申請的空間都在堆上。

  • 不同點:
    (1)、操作物件同
    malloc/free是c/c++語言的標準庫函式,new/delete是c++的運算子。
    對非內部資料物件,malloc/free無法滿足動態物件要求。物件在建立時要自動執行建構函式,物件消亡之前要自動執行解構函式,而malloc/free是庫函式,不是運算子,故不在編譯器控制權限之內,不能夠將執行建構函式和解構函式強加於malloc/free身上。而由於new/delete是C++語言,能夠完成動態記憶體分配和初始化工作,並能夠完成清理與釋放記憶體工作,即能夠自動執行建構函式和解構函式;
    (2)、用法不同

malloc分配記憶體空間前需要計算分配記憶體大小;而new能夠自動分配記憶體空間;

malloc是底層函式,其函式返回值型別為void *;而new運算子呼叫無參建構函式,故返回值為對應物件的指標;

malloc函式型別不是安全的,編譯器不對其進行型別轉換、型別安全的相關檢查。malloc申請空間後,不會對其初始化,要單獨初始化;而new型別是安全的,因為它內建了sizeof、型別轉換和型別安全檢查功能,且在建立物件時,就完成了初始化工作,一般初始化呼叫無參建構函式;

operator new對應於malloc,且operator new可以過載,可以自定義記憶體分配策略,甚至不做記憶體分配,甚至分配到非記憶體裝置上;但malloc不能。

free只進行釋放空間;而delete則釋放空間的同時呼叫解構函式。此外delete使用是注意釋放陣列的方法為delete []陣列名。

  • 聯絡
    new和delete功能覆蓋了malloc/free,但因C++程式常會用到C函式,而C函式只能使用malloc/free管理動態記憶體。此外,使用是malloc和free搭配使用,new和delete搭配使用,不能混亂使用。

相關推薦

c++動態記憶體管理new/delete

C++動態記憶體管理 通過new/delete動態管理物件 通過new[]/delete[]動態管理物件陣列 int *p1 = new int; //動態分配4個位元組 int *p2 = new int(1); //動態分配4個位元組,

c++:動態記憶體分配newdelete的使用

//============================================================================ // Name : c++動態記憶體分配.cpp // Author : // Versi

C#記憶體管理儲存區域劃分

首先,我們先了解一下資料在記憶體中的儲存方式,根據變數值的生存週期,可以分為靜態儲存區和動態儲存區。如下: 所謂靜態儲存區是指在程式執行期間分配固定的儲存空間的方式,而動態儲存區是指程式執行期間根據需要進行動態分配儲存空間的方式。 靜態變數和全域性變數儲存在靜態儲存區,在

C++快速入門---動態記憶體管理23

C++快速入門---動態記憶體管理(23)   靜態記憶體:變數(包括指標變數)、固定長度的陣列、某給定類的物件 動態記憶體:由一些沒有名字、只有地址的記憶體塊構成的,那些記憶體塊是在程式執行期間動態分配的。   用new向記憶體池申請記憶體 用delet

C++學習筆記-DLL動態記憶體管理

動態記憶體管理 在dll中malloc的記憶體,必須在dll中free 注:這是由Windows自己的特點決定! 如果 a 編譯成靜態庫,有下面兩種解決方法: 1.b.dll 和 c.dll 使用

c/c++ 動態記憶體管理

C語言中 使用:malloc/calloc/realloc/free 進行動態記憶體管理 calloc:分配n個長度為size的連續記憶體空間,並初始為0 realloc:重新分配空間 void* realloc(void* p,size_t size)

c++之動態記憶體管理

1.new/delete 和operator new/operator delete和malloc/free的關係 ①new呼叫operator new分配空間②new呼叫建構函式初始化物件。③delete呼叫解構函式清理物件 ④delete呼叫operator delete釋放空間 ⑤ope

Objective-C記憶體管理機制

從蘋果的官方文件來看,OC對應用程式的記憶體管理提供了2種方法。 第一種即“manual retain-release”(MRR),手動保留釋放,也可理解為手動引用計數。 第二種,“Automatic Reference Counting”(ARC),自動引用計數。但是ARC並不等同垃圾回收。在蘋果的官方

C ++ 記憶體 | C/C++的動態記憶體管理_1

C/C++的動態記憶體管理 1、 C語言中,我經常會用到動態記憶體管理的三個命令: malloc calloc rolloc free (1)malloc 用來申請head記憶體空間的記憶體。 (2)calloc malloc 和 call

淺談C語言和C++記憶體管理

面試題 記憶體管理了解多少,說出你知道的 C語言記憶體分配佈局 程序在記憶體中的佈局 最高記憶體地址       棧區(函式內部的區域性變數,自動釋放 )   堆疊增長區       堆區(動態記憶體分配,由程式設計師申請釋放)     其他段  

C++】動態記憶體管理

一、C/C++記憶體分佈 我們先回顧在C語言學習階段學習過的一張記憶體分佈圖: 然後我們可以根據上邊的這幅圖,做一下下面這道筆試中一定會遇到的判斷儲存區的筆試題: int globalVar = 1

C語言動態記憶體管理malloc、calloc、realloc、free的用法和注意事項

此文是參考http://www.cplusplus.com/reference/cstdlib/裡的動態記憶體管理部分所寫,如發現有問題和不足之處,請參看原文,最好能幫忙指出,謝謝。 1.void* malloc (size_t size); malloc:分配一塊size

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

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

Linux記憶體管理分段和分頁

前一段時間看了《深入理解Linux核心》對其中的記憶體管理部分花了不少時間,但是還是有很多問題不是很清楚,最近又花了一些時間複習了一下,在這裡記錄下自己的理解和對Linux中記憶體管理的一些看法和認識。 我比較喜歡搞清楚一個技術本身的發展歷程,簡而言之就是這個技術是怎麼發

C語言動態記憶體管理:malloc、realloc、calloc以及free函式

我們已經掌握的記憶體開闢方式有: int val = 20;//在棧空間上開闢四個位元組 char arr[10] = {0};//在棧空間上開闢10個位元組的連續空間 但是這種開闢空間的方式有兩個特點: 1. 空間開闢的大小是固定的。

C語言動態記憶體管理動態記憶體分配

動態記憶體管理同時還具有一個優點:當程式在具有更多記憶體的系統上需要處理更多資料時,不需要重寫程式。標準庫提供以下四個函式用於動態

Linux記憶體管理 透徹分析

摘要: 本章首先以應用程式開發者的角度審視Linux的程序記憶體管理,在此基礎上逐步深入到核心中討論系統實體記憶體管理和核心記憶體的使用方法。力求從外到內、水到渠成地引導網友分析Linux的記憶體管理與使用。在本章最後,我們給出一個記憶體對映的例項,幫助網友們理解核心記憶體管理

關於c++空格的輸入學生筆記

在c++中cin>> >>是空字元,cin會自動省去空格,所以cout是輸不出空格的ASCII碼的。這時需要cin.get(ch)。它的作用是獲取一個當前輸入的字元並寫入變數ch中,cin.get(ch)包含在中。 用法如: #include using namesp

c++cmath函式庫學生筆記

c++中cmath是一個重要的數學函式庫。呼叫時必須包含cmath主檔案。 #include #include 其常用函式原型: int abs(int n) 求n的絕對值 double cos/sin/tan(double x) 求x的三角函式值(x為弧度值) double exp(dou

C#的字串類string類

1.字串搜尋: string s="ABC科學"; int i=s.IndexOf("科"); 注意:1)索引從0開始,如果沒有找到則返回值為-1;            2)C#中,ASCII和