**棧:**又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。
**記憶體對映段:**是高效的 i/o 對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共
享記憶體,做程序間通訊。
**堆:**程式執行過程中動態分配,向上生長。
**資料段:**全域性資料、靜態資料。
****段:**唯讀常量、可執行**。
void test (
)
⚠️ 這裡不能free(p2)
,因為 realloc 在申請記憶體時可能會改變儲存的位址,這裡只需要 free p3 就行。
對於內建型別
int
*p_a =
newint
;int
*p_b =
newint
(233);
int*p_arr =
newint[10
];delete p_a;
delete p_b;
delete
p_arr;
對於自定義型別class
student
;student *ps1 =
new student;
student *ps2 =
new student[10]
;
在申請自定義型別的空間時,new 會呼叫建構函式,delete 會呼叫析構函式,而 malloc 與 free 不會。
operator new 和 operator delete 是系統提供的全域性函式,new 在底層呼叫 operator new 全域性函式來申請空間,delete 在底層通過 operator delete 全域性函式來釋放空間。
operator new 實際也是通過 malloc 來申請空間,如果 malloc 申請空間成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異常。operator delete 最終是通過free來釋放空間的。
operator new
/*
operator new:
該函式實際通過malloc來申請空間,當malloc申請空間成功時直接返回;
申請空間失敗,嘗試執行空間不足應對措施,如果改應對措施使用者設定了,則執行,否則拋異常。
*/void
*__crtdecl operator
new(size_t size)
_throw1
(_std bad_alloc)
return
(p);
}
operator delete/*
operator delete: 該函式最終是通過free來釋放空間的 */
void
operator
delete
(void
*puserdata)
/* free
*/#define free(p) _free_dbg(p, _normal_block)
? 過載類專屬 operator new/ operator delete
針對鍊錶的節點 listnode 通過過載類專屬 operator new/ operator delete,實現鍊錶節點使用記憶體池申請和釋放記憶體,提高效率。
struct listnode
void
operator
delete
(void
* p)};
class
list
~list()
delete _head;
_head =
nullptr;}
private
: listnode* _head;};
intmain()
內建型別
如果申請的是內建型別的空間,new 和 malloc,delete 和 free 基本類似。
不同的地方是:new/delete 申請和釋放的是單個元素的空間,new 和 delete 申請的是連續空間,而且 new 在申請空間失敗時會拋異常,malloc 會返回 null 。
自定義型別定位 new 表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件。
使用場景:定位 new 表示式在實際中一般是配合記憶體池使用。因為記憶體池分配出的記憶體沒有初始化,所以如果是自定義型別的物件,需要使用 new 的定義表示式進行顯示調建構函式進行初始化。
用法:
new
(place_address) type;
// 或者
new(place_address)
type
(initializer-list)
;// place_address 必須是乙個指標,initializer-list 是型別的初始化列表
date* pd =
(date*
)malloc
(sizeof
(date));
// 此時的 pd 指向的空間只是乙個大小和 date 物件一樣的空間,並不能算是乙個物件,建構函式還沒有執行
new(pd)
date
(1939,2
,3);
C和Cpp裡面的動態記憶體管理
c語言裡面的動態記憶體管理函式,介紹的有4個,分別是malloc,realloc,calloc,和free,其函式原型分別如下 void malloc size t size void calloc size t num elements,size t element size void reall...
CPP 基礎 關於記憶體分配
1 c中的malloc和c 中的new有什麼區別 1 new delete 是操作符,可以過載,只能在c 中使用。2 malloc free是函式,可以覆蓋,c c 中都可以使用。3 new 可以呼叫物件的建構函式,對應的delete呼叫相應的析構函式。4 malloc僅僅分配記憶體,free僅僅 ...
學生管理系統 大工cpp
題目 基於鍊錶的學生資訊管理系統 要求 1 插入節點 輸入學生資訊後,生成節點並插入鍊錶中 2 刪除節點 根據給定的學生姓名或學號刪除該學生節點 3 查詢節點 根據給定的學生姓名或學號查詢學生資訊,並顯示出來 4 查詢並顯示總成績最高和最低的學生資訊 5 統計鍊錶中的學生人數 6 時間允許時選做 對...