首先來看一段**?
來看下面幾個問題:#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()
說明:
c語言記憶體管理方式在c++中可以繼續使用,但有些地方就無能為力而且使用起來比較麻煩,因此c++提出了自己的記憶體管理方式:通過new和delete操作符進行動態記憶體管理。#include
#include
#define n 10
intmain()
注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new和delete。
#include
class
test
~test()
};intmain()
注意:new和delete操作符針對自定義型別時,new會呼叫建構函式,delete會呼叫析構函式。而malloc和free不會。[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是系統提供的可以用來進行動態記憶體申請和釋放的操作符。operator new和operator delete是系統提供的全域性函式,new在底層呼叫operator new全域性函式來申請空間,delete在底層呼叫operator delete全域性函式釋放空間。
從上述兩個全域性函式的原始碼可以看出,operator new實際也是通過malloc來申請空間的。如果malloc申請空間成功就直接返回,否則丟擲異常。operator delete最終是通過free來釋放空間的。void
*__crtdecl operator
new(size_t size)
_throw1
(_std bad_alloc)
return
(p);
}void
operator
delete
(void
*puserdata)
如果申請的是內建型別空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常,malloc會返回null。
new的原理:
delete的原理:
new t[n]的原理:
delete的原理:
首先來看一段**:
#include
class
test
~test()
};intmain()
從上面可以看出,建構函式是自動呼叫的,沒有辦法顯式呼叫,析構函式可以顯式呼叫。所以就有了定位new表示式。[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的表示式進行顯式呼叫建構函式進行初始化。
共同點:#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變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...