C 記憶體管理

2021-08-29 18:21:18 字數 4627 閱讀 6097

首先來看一段**

#include

#include

int var1 =1;

static

int var2 =1;

void

memorytest()

;char arr2=

"hello, world!"

;char

* arr3 =

"hello, world!"

;int

* ptr1 =

(int*)

malloc

(sizeof

(int)*

4);int

* ptr2 =

(int*)

calloc(4

,sizeof

(int))

;int

* ptr3 =

(int*)

realloc

(ptr2,

sizeof

(int)*

4);free

(ptr1)

;free

(ptr3);}

intmain()

來看下面幾個問題

說明

#include

#include

#define n 10

intmain()

c語言記憶體管理方式在c++中可以繼續使用但有些地方就無能為力而且使用起來比較麻煩,因此c++提出了自己的記憶體管理方式:通過new和delete操作符進行動態記憶體管理

注意申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new和delete

#include

class

test

~test()

};intmain()

[sss@aliyun memory_allocate]$ g++ mem_alloc_class.cc -o mem_alloc_class

[sss@aliyun memory_allocate]$ ./mem_alloc_class

single:

test()

~test()

multi:

test()

test()

test()

~test()

~test()

~test

()

注意:new和delete操作符針對自定義型別時,new會呼叫建構函式,delete會呼叫析構函式。而malloc和free不會。

new和delete是系統提供的可以用來進行動態記憶體申請和釋放的操作符operator new和operator delete是系統提供的全域性函式new在底層呼叫operator new全域性函式來申請空間,delete在底層呼叫operator delete全域性函式釋放空間。

void

*__crtdecl operator

new(size_t size)

_throw1

(_std bad_alloc)

return

(p);

}void

operator

delete

(void

*puserdata)

從上述兩個全域性函式的原始碼可以看出,operator new實際也是通過malloc來申請空間的如果malloc申請空間成功就直接返回,否則丟擲異常operator delete最終是通過free來釋放空間的

如果申請的是內建型別空間new和malloc,delete和free基本類似不同的地方是new/delete申請和釋放的是單個元素的空間new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常,malloc會返回null

new的原理

delete的原理

new t[n]的原理

delete的原理

首先來看一段**:

#include

class

test

~test()

};intmain()

[sss@aliyun memory_allocate]$ g++ constructor.cc -o constructor

constructor.cc: in function 『int

main

()』:

constructor.cc:17:

4: error: invalid use of 『test:

:test』

t.test()

;^

從上面可以看出,建構函式是自動呼叫的,沒有辦法顯式呼叫,析構函式可以顯式呼叫。所以就有了定位new表示式。

定位new表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件

格式

使用場景

定位new表示式在實際中一般是配合記憶體池使用。因為記憶體池分配出的記憶體沒有初始化,所以如果是自定義型別的物件,需要使用new的表示式進行顯式呼叫建構函式進行初始化

#include

#include

class

test

~test()

private

:int _data;};

intmain()

共同點

不同點

class

heaponly

private

:heaponly()

heaponly

(const heaponly&);

};

class

stackonly

private

:heaponly()

};

記憶體洩漏是指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並不是說內存在物理上的流失,而是應用程式分配某段記憶體後,因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。

// 記憶體申請了忘記釋放。

int* p1 =

(int*)

malloc

(sizeof

(int))

;int

* p2 =

newint

;int

* p3 =

newint[10

];// 這裡func函式拋異常導致delete p3未執行,p3沒釋放。

func()

;delete

p3;

記憶體洩漏分類

使用記憶體洩漏檢查工具來檢查記憶體洩漏

比如linux下的valgrind、windows下的vld等待。這裡就不一一介紹了。

32位程序,我們使用malloc最多可以申請2g的空間,但是如果是64位的程序,就可以申請很大,因為64位程序的虛擬位址空間很大很大

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...

C 記憶體管理

在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...

c 記憶體管理

這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...