文章目錄
- 指針分配與釋放 :C++ new/delete VS C malloc/free
- C++ new/delete
- C malloc/free
- 指針銷毀
- 智能指針
指針分配與釋放 :C++ new/delete VS C malloc/free
new
:分配內存、調用類的構造函數。delete
:調用類的析構函數和釋放內存(先調用對象的析構函數,然后利用全局的operator delete(一般通過std::free實現)函數釋放內存,并不會將指針自動置空。
malloc
和free
只是分配和釋放內存。
new
建立的是一個對象,而malloc
分配的是一塊內存。
new
建立的對象可以用成員函數訪問,不要直接訪問它的地址空間;malloc
分配的是一塊內存區域,用指針訪問,可以在里面移動指針。
new
出來的指針是帶有類型信息的,而malloc
返回的是void指針。
C++ new/delete
/* new & delete */
Obj *a = new Obj;
//...
delete a;
C malloc/free
/* malloc & free */
Obj *a = (Obj*)malloc(sizeof(obj));
a->Intialize();
// ...
a->Destroy();
free(a);
malloc/free不能執行構造與析構函數,必須調用成員函數Initialize和Destroy來完成初始化與清除工作。
指針銷毀
if (p != NULL)
{delete p; // 僅刪除p中內容,p不為空p == NULL; // 指針設為空,防止二次delete崩潰
}
int* ,char* 等只要不是new的,不用釋放,系統會自動把他們占的內存釋放掉,只有new的才會手動的去delete。局部變量,存在于棧上,比如int *p;p在棧上,而且p的值也是棧的一個地址。
但是當int *p = new int ;這時候,p這個變量是在棧上的。但是p的值是一個地址,這個地址是堆上的一個地址。如果不delete p;那么,這個地址會一直被占用著,不能被其他的對象所使用。
因此棧的空間會自動釋放,而堆里的空間必須手動釋放。
智能指針
:指針自動銷毀
unique_ptr
shared_ptr
intrusive_ptr