對於new和delete的探索和伸展

2021-09-24 15:27:29 字數 1333 閱讀 9414

例如簡單型別在堆區:

// an highlighted block

int i =

newint

;//會呼叫

void

*__crtdecl operator new

(size_t size)

_throw1

(_std bad_alloc)

return

(p);

}int *p =

newint(4

)//也可以指定值初始化,格式和結構或者類的初始化一樣。這裡是在堆區開闢簡單型別。會直接呼叫operate new

複雜型別在堆區

class

object

private

: int val_;

}int main()

簡單型別與複雜型別的operator new

int *p =

newint[10

];//同樣可以在其後面 新增小括號來置為0,小括號不能指定值

簡單型別還包括只有簡單型別的結構體

struct node

;node* lis =

newnode[10

];

那麼如何釋放簡單型別的動態陣列變數呢

delete p  或者 delete p[

]delete lis 或者 delete lis[

]

之前所了解的都是new與delete配對,new與delete配。但為什麼簡單型別就算不配對記憶體也沒洩漏?

放在複雜型別來解釋

class

object

~object()

private

: int val_;};

int main()

測試手段,先說乙個結論,在複雜型別陣列定義時,複雜型別需要有預設建構函式。其指標的前四個位元組會儲存陣列大小。例如使用上面的例子

int *v =

(int *

)p; int n =

*(v-1)

;// n = 3

那麼簡單型別動態陣列裡面有沒有這個資訊?,答案時沒有,返回的值是其他地方的。所以,複雜型別陣列使用delete也會釋放掉這個n的記憶體,這也就是簡單型別用delete和delete沒區別的原因(沒有儲存n)。

operator delete

delete 會指向 p所指的位址, delete會指向p - 1(p是int *)的位址

New和delete的原理

new和delete的原理 當我們在程式中寫下 new 和 delete 時,我們實際上呼叫的是 c 語言內建的 new operator 和 delete operator.所謂語言內建就是說我們不能更改其含義,它的功能總是一致的。以 new operator 為例,它總是先分配足夠的記憶體,而後...

new 和delete的實現

通過了解發現,原來在new的內部實現中只涉及記憶體的分配,也就是只考慮malloc的使用,而關於呼叫建構函式的部分則是交由編譯器處理,所以這裡看不到呼叫建構函式的 由malloc分配記憶體空間,然後判斷是否分配,並發出bad alloc的異常訊息.如果分配成功,返回指向記憶體的指標,否則。返回nul...

new和delete的使用

一 基本資料型別的動態分配 new和delete已經完全包含malloc和free的功能,並且更強大 方便 安全。使用動態分配記憶體時不能忘記釋放記憶體,不要忘記出錯處理!下面先看new和delete的基本使用方法。includeusing namespacestd intmain 釋放記憶體del...