1. 程式人生 > >C++記憶體分配理解一

C++記憶體分配理解一

記憶體分配

一般我們在使用C++來建立一個內建物件或者一個類的時候。一般都沒有想過底層是怎樣去實現的。本文是根據侯捷的視訊進行的一部分總結,只考慮堆上的分配。

首先來看一張圖
基本描述

其實根據這張圖我們可以去了解到C++基本記憶體分配規則了。在不考慮OS API的影響下,一切都是基於C語言當中的malloc/free來進行記憶體的分配和回收的。

現在再來進一步看一下各個函式:
這裡寫圖片描述

接下來在看一下具體應用:
展示了一些用法,其實都不重要。
這裡寫圖片描述

new的解剖

這裡寫圖片描述
1進行operator new呼叫分配記憶體
2一個強制轉換
3呼叫建構函式,但注意。不是所有環境都支援直接呼叫,一般是給編譯器處理

operator new

這裡寫圖片描述
這個函式是不拋異常的,分配到了記憶體就返回,不然就呼叫_callnewh(vc環境下)
_callnewh作用:呼叫一個你準備的函式,用於在你記憶體不夠malloc的時候有機會釋放一部分記憶體,在下一次迴圈的時候可以malloc到記憶體。

delete的解析

相應的delete和new原理相似
這裡寫圖片描述
一樣的,當呼叫delete的時候,先對物件進行析構(這個是可以直接呼叫的),在通過operator delete進行釋放,而operator delete中呢,就是簡單的呼叫了free。

new/new[]和delete/delete[]

先來看兩張圖
這裡寫圖片描述


這裡寫圖片描述

在我們進行new的時候當new的是一個數組的時候,記憶體塊中會有一塊存放整個陣列大小的cookie,用於釋放。
如圖,使用delete當釋放基本型別的時候由於解構函式沒有意義,所以加不加[]都無所謂,而當使用類物件的時候,並且解構函式有意義的時候(例如釋放一些申請的記憶體,在我的環境下測試時,顯示的給出了解構函式就不行)。如下兩張圖:
因為這時會在記憶體塊錢加一個物件數量值。若還是以delete去釋放就不會正確的找到有幾個物件,在我的vs環境下還會報錯。
這裡寫圖片描述
這裡寫圖片描述

placement new

這個其實是在已經分配好的記憶體上進行的操作,下圖給出的是一般的使用形式。
這裡寫圖片描述
來看一下Complex* pc = new(buf)Complex(1,2)的編譯器解析
這樣一看,其實還是呼叫的是operator new(size _t,void* loc),當這樣呼叫的時候,函式直接返回傳入的loc
這裡寫圖片描述

相關推薦

C++記憶體分配理解

記憶體分配 一般我們在使用C++來建立一個內建物件或者一個類的時候。一般都沒有想過底層是怎樣去實現的。本文是根據侯捷的視訊進行的一部分總結,只考慮堆上的分配。 首先來看一張圖 其實根據這張圖我們可以去了解到C++基本記憶體分配規則了。在不考慮OS AP

全面介紹Windows記憶體管理機制及C++記憶體分配例項():程序空間

本文背景: 在程式設計中,很多Windows或C++的記憶體函式不知道有什麼區別,更別談有效使用;根本的原因是,沒有清楚的理解作業系統的記憶體管理機制,本文企圖通過簡單的總結描述,結合例項來闡明這個機制。 本文目的: 對Windows記憶體管理機制瞭解清楚,有效的利用C++

C/C++記憶體分配【轉】

(轉自:http://blog.51cto.com/jiuxiaotian/860844) 1:c中的malloc和c++中的new有什麼區別 malloc和new有以下不同: (1)new、delete 是操作符,可以過載,只能在C++中使用。 (2)malloc、free是函式,可以覆蓋,C

侯捷 C++記憶體管理 (

本篇記錄 《侯捷 C++記憶體管理 》,整理各節的要點,以備查閱 1.Overview 2.記憶體分配的每一層面 3.四個層面的基本用法 1)、對比一下: 4.基本構件之一newdelete expression(上) ——》new和operator new、m

C++記憶體分配方式-堆、棧、靜態儲存區、常量儲存區

C++中,記憶體分為5個區:堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。棧:是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數、函式引數等。堆:是由new分配的記憶體塊,由程式設計師釋放(編譯器不管),一般一個new與一個delete對應,一個new[]與一個del

c++ 記憶體分配及相關關鍵字

allocator 動態分配記憶體,將記憶體分配和物件構造分開。 new、delete 和 new[]/delete[]的區別 int *pia = new int[10]; delete []pia; 1.對於非內建物件,在 new [] 時將多分配 4 個位元組

系統學習-C++記憶體分配

目錄 程式結構理解 程式執行過程 Stack區 反彙編分析 原始碼 反彙編 總結 C++記憶體分配是一個很基礎的問題,明白這個分配機制,有很多C++的問題都可以很

C++類的理解():類的初識

一、類的意義,以及類與物件: 類的內容比較多,但類是面向物件的基礎,所謂面向物件(object),其實就是一種更高層次的模組化,也稱為封裝。C語言中,稍微複雜點的資料結構都是用結構體來寫的,結構體本質上就是把一些相關的資訊打包儲存,比如貓: struct

C/C++記憶體分配方式與儲存區

C/C++記憶體分配有三種方式: [1]從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。 [2]在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處

c++記憶體分配方式,堆與棧區別

1)棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 2)堆區(heap):一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。 3)全域性/靜態區

Qt總結之十二:C/C++記憶體分配方式與儲存區

一、C/C++記憶體分配有三種方式   從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元

C++記憶體分配的五種方法 與 c++記憶體問題

在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。    棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。    堆,就是那些由new分配的記憶體塊,他們的釋放編譯

C++記憶體分配/刪除/洩露/單例模式等相關面試題

https://blog.csdn.net/Damn_Yang/article/details/83823601 1.malloc/free和new/delete的區別 2.請設計一個類,該類只能在堆上建立物件 3.請設計一個類,該類只能在棧上建立物件 4.單例模式(這個在面試中經常出現) 5.

Python程式設計學習5:python id()函式和記憶體分配理解

1.  id()函式可返回物件的記憶體地址python中會為每個物件分配記憶體,哪怕他們的值完全相等。id(object)函式是返回物件object在其生命週期內位於記憶體中的地址,id函式的引數型別是一個物件。如下例子:c, d 和 2.0 地址不同,但值相等。c = 2.

C++ 記憶體分配(new,operator new)詳解

    在SGI STL原始碼中,defalloc.h和stl_construct.h中提供了最簡單的空間配置器(allocator)封裝,見《STL原始碼剖析》P48。它將物件的空間分配和構造分離開來,雖然在defalloc.h中僅僅是對::operator new和::operator delete的一層

C++ 記憶體分配和回收 (new 和delete)

“new”是C++的一個關鍵字,同時也是操作符。對於new的內容總結。 1、new的過程 當我們使用關鍵字new在堆上動態建立一個物件時,它實際上做了三件事:獲得一塊記憶體空間、呼叫建構函式、返回正確的指標。當然,如果我們建立的是簡單型別的變數,那麼第二步會被省略。假如我們

全面介紹Windows記憶體管理機制及C++記憶體分配例項

本文基本上是windows via c/c++上的內容,筆記做得不錯。。 本文背景: 在程式設計中,很多Windows或C++的記憶體函式不知道有什麼區別,更別談有效使用;根本的原因是,沒有清楚的理解作業系統的記憶體管理機制,本文企圖通過簡單的總結描述,結合例

C++記憶體分配和管理

/* String.h */ #ifndef STRING_H_ #define STRING_H_ class String { private: char * str; //儲存資料 int len; //字串長度 public: String(const char * s); //

c&c++記憶體分配的三種方式

三種記憶體分配方式: 一:從全域性儲存區域分配:這時記憶體在程式編譯階段就已經分配好,該記憶體在程式執行的整個週期都有效,如:全域性變數、static靜態變數。 二:從棧區分配:在執行函式的時候,函式中的區域性變數的儲存單元都可以從棧中分配,函式執行結束後這些儲存單元都會

PHP7記憶體分配管理()

最近沒什麼事情,就決定分析一下php7的記憶體管理方面的部落格,首先不得不說,PHP7的記憶體管理的程式碼和之前的版本比起來,思路上清晰了很多。記憶體的分配也分為了,小記憶體,大記憶體和超大記憶體。第一個章節我們就分析一下整個記憶體管理的結構吧。 一.主體的結