|
kooafssll5j64066433251.gif (60.41 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
kooafssll5j64066433251.gif
2024-12-5 22:02 上傳
% C9 _# M- M5 d1 k點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
( y" t( o3 q& M0 nnew 與智能指針提供了類型安全、自動(dòng)管理內(nèi)存等優(yōu)點(diǎn),能夠更好地滿足大多數(shù)場(chǎng)景的需求。% a3 Y3 T) ` g# q K* p
1
( N+ ]/ r9 X2 Y* U. Emalloc 和 new 的區(qū)別$ J. c |2 K, d% w4 o. _3 N
malloc 是 C 語(yǔ)言的內(nèi)存分配函數(shù),分配的內(nèi)存是未初始化的,并返回 void* 類型的指針。# g! c" R% R4 b, r! u, g! Q
" r/ L+ m& C% S8 W: w要想將 malloc 的返回值賦給特定類型的指針,需要進(jìn)行顯式類型轉(zhuǎn)換,這就缺乏類型安全性。
6 R% A4 l; t1 x8 [3 {; ^- K9 B) m. N* I6 W6 V5 a
而 C++ 的 new 操作符會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),并返回指定類型的指針,避免了類型轉(zhuǎn)換問題,增加了類型安全性。4 B% v* `3 p) z) c% w6 R/ c
) d, g% m" G4 ~4 P9 i: h& H5 L! W" nnew 不僅分配內(nèi)存,還會(huì)調(diào)用類的構(gòu)造函數(shù)來(lái)初始化對(duì)象。而 malloc 僅分配內(nèi)存,不做初始化。
! R8 ?. r+ y& [6 [8 u2 l3 ^8 N
5 }6 O: ]0 K, ^& M6 T5 s3 J7 e: ~這意味著使用 malloc 時(shí),我們無(wú)法直接管理對(duì)象的生命周期,必須手動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)(這幾乎不常見且容易出錯(cuò))。
8 z9 O0 }+ M {# O! h0 d2
0 g# Z$ w" F T E智能指針和現(xiàn)代 C++ 內(nèi)存管理
! U' n0 K6 T0 e9 y1 ]- g% nC++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過(guò) RAII(Resource Acquisition Is Initialization)機(jī)制幫助自動(dòng)管理內(nèi)存。6 \6 L( P9 I' a7 m0 O$ \
% L1 \# e3 Y) g7 A2 ?: Y這讓開發(fā)者幾乎不需要直接調(diào)用 new 或 delete,大幅降低了內(nèi)存泄漏的風(fēng)險(xiǎn)。更不用說(shuō) malloc 和 free 了。) x) V! r$ ?8 ^. e) A# y9 h
. c5 l! a0 v+ h1 f7 @6 r例如:& r( d/ u: R8 ]1 y
1 C6 h, k/ P; Y7 X/ g3 h4 B
std::unique_ptrptr = std::make_unique(10); // 自動(dòng)管理內(nèi)存
4 `& Q/ @ i7 d# D8 ]! @使用智能指針,內(nèi)存會(huì)在指針超出作用域時(shí)自動(dòng)釋放,無(wú)需手動(dòng)調(diào)用 free。, x/ p3 I) C6 O) l5 c8 ~% H7 G0 h
3* \5 F% Y/ q0 D2 X4 ^( n% I
使用 malloc 的場(chǎng)景
4 ]- a# }5 c" Y3 m盡管現(xiàn)代 C++ 提供了更好的內(nèi)存管理工具,但在少數(shù)特定場(chǎng)景下,malloc 仍然可能有其用武之地。
& t2 K) X, H7 W j p! O$ ^9 W" l6 ~) u# R, ?
如果你需要與大量 C 代碼或使用 C 庫(kù)的項(xiàng)目協(xié)作(如某些底層嵌入式系統(tǒng)開發(fā)),使用 malloc 會(huì)更容易實(shí)現(xiàn)與 C 代碼的無(wú)縫交互。
% | k5 p5 O* M; w1 b/ r! w
: o4 P% P8 Y1 |# k# z在某些性能要求極高的系統(tǒng)中,為了精細(xì)控制內(nèi)存布局和管理,開發(fā)者可能會(huì)實(shí)現(xiàn)自定義的內(nèi)存分配器。
5 i! J( C+ h# ^) R
; b) l5 C; Y* _, O+ B/ \3 ^: p/ L' ]; @自定義分配器的內(nèi)部實(shí)現(xiàn)可能基于 malloc 這種低級(jí)分配函數(shù),以便更靈活地優(yōu)化內(nèi)存操作。
7 Q- `# r F; F! D
! G/ E$ K; p) e不需要構(gòu)造函數(shù)的分配:對(duì)于不需要初始化的原始數(shù)據(jù)塊或 POD(Plain Old Data)類型數(shù)據(jù),malloc 有時(shí)可能更加直接,比如用于分配一個(gè)不需要構(gòu)造和析構(gòu)的字節(jié)緩沖區(qū)。
* L+ H* w. ]1 j7 {4
; C$ a2 A: b( D$ F9 T實(shí)際代碼示例/ ~! n6 u( k6 D3 E
C++ 的方式
( Q6 J/ O5 i- i, I4 `' S/ Cstruct MyClass { MyClass() { std::cout "Constructed- n9 `1 t* P& Z) _
"; } ~MyClass() { std::cout "Destructed7 _- x* H1 e- [" G# f
"; }};
9 D, c4 |9 [* | ]* c1 f4 U$ aint main() { auto ptr = std::make_unique(); // 自動(dòng)調(diào)用構(gòu)造/析構(gòu)}
- u2 u7 T8 P- ]$ U) Y* U( W使用 malloc 的方式(不推薦,除非必須兼容 C)
; g6 @: x9 H E: hstruct MyClass { MyClass() { std::cout "Constructed
$ N2 v: W, f7 l' T2 v4 _: W"; } ~MyClass() { std::cout "Destructed' G9 v, c/ m( F! P; Q: J" {) a
"; }};
. p% m4 a2 u* S7 u7 w( c6 m" {int main() { MyClass* ptr = (MyClass*)malloc(sizeof(MyClass)); new(ptr) MyClass; // 手動(dòng)調(diào)用構(gòu)造函數(shù) ptr->~MyClass(); // 手動(dòng)調(diào)用析構(gòu)函數(shù) free(ptr);}; ~$ M; D! H7 @: Z! j. ]
在第二種方式中,手動(dòng)管理構(gòu)造和析構(gòu)顯得繁瑣且不直觀,容易引入內(nèi)存泄漏或未定義行為。% ]8 o# x1 l2 J9 l( J
u33aa4nltj464066433351.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
u33aa4nltj464066433351.jpg
2024-12-5 22:02 上傳
0 E* x& {9 c# J" F
4kkspejwcgh64066433451.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
4kkspejwcgh64066433451.gif
2024-12-5 22:02 上傳
: E" J( ]1 e6 @9 T# U$ X5 D
點(diǎn)擊閱讀原文,更精彩~ |
|